Как связать свойство Enabled кнопки в Winforms со свойством CheckedItems.Count CheckedListBox
У меня есть CheckedListBox в форме. Каждый элемент представляет собой тему сообщения электронной почты зарегистрированного пользователя.
Я пытаюсь добиться того, чтобы при выборе только одного элемента кнопки "Редактировать" и "Удалить" были включены, в противном случае - отключены.
Я попытался использовать следующий обработчик событий после установки для свойства CheckOnClick значения true, но он не работает:
private void clbEmailsSubjects_Click(object sender, EventArgs e)
{
btnEdit.Enabled = btnDelete.Enabled = (clbEmailsSubjects.CheckedItems.Count == 1);
}
Какие-либо предложения?
Изменить: я выбрал элемент, но обе кнопки были по-прежнему отключены.
Теперь после выбора второго элемента они стали активными:
Эффект кажется противоположным. Я думаю, что значение CheckedItems.Count может быть обновлено после выполнения обработчика события.
2 ответа
Было бы правильнее использовать ItemCheck
событие, чем Click
событие (так как клик, возможно, не попал на флажок). Но в любом случае, событие будет запущено до Checked
собственность на CheckBox
изменяется, поэтому вы не можете устанавливать включенные состояния в любом из этих обработчиков событий. Однако вы можете отложить обработку, пока события не будут обработаны с помощью BeginInvoke
, как это:
private void clbEmailsSubjects_ItemCheck(object sender, ItemCheckEventArgs e)
{
BeginInvoke((Action)(() =>
{
btnEdit.Enabled = btnDelete.Enabled =
(clbEmailsSubjects.CheckedItems.Count == 1);
}));
}
Вам необходимо зарегистрироваться на ItemCheck
событие на вашем CheckedListBox
, Тогда следующий код даст вам желаемый результат:
private void clbEmailsSubjects_ItemCheck(object sender, ItemCheckEventArgs e)
{
btnEdit.Enabled = btnDelete.Enabled =
(clbEmailsSubjects.CheckedItems.Count == 2 && e.NewValue == CheckState.Unchecked) ||
(clbEmailsSubjects.CheckedItems.Count == 0 && e.NewValue == CheckState.Checked);
}