2015-12-29 2 views
0

У меня есть CheckedListBox в форме. Каждый элемент представляет собой тему сообщения электронной почты зарегистрированного пользователя.Как связать свойство Enabled кнопки в Winforms с объектом CheckedItems.Count CheckedListBox

form

То, что я пытаюсь добиться того, что при выборе только один элемент, как редактировать и кнопки Delete должен быть включен, в противном случае отключена.

Я пытался использовать следующий обработчик событий после установки свойства CheckOnClick истина, но она не работает:

private void clbEmailsSubjects_Click(object sender, EventArgs e) 
{ 
    btnEdit.Enabled = btnDelete.Enabled = (clbEmailsSubjects.CheckedItems.Count == 1); 
} 

Есть предложения?

Редактировать: Я выбрал элемент, но обе кнопки по-прежнему были отключены.

enter image description here

Теперь, после выбора второго пункта они станут доступными:

enter image description here

Эффект, кажется, наоборот. Я думаю, что значение CheckedItems.Count может быть обновлено после выполнения event_handler.

+0

Как конкретно код у вас «не работает»? – CodingGorilla

+0

Какое поведение вы наблюдаете? –

+0

Я только что редактировал свой пост. – Andrei

ответ

2

Было бы правильнее использовать событие ItemCheck, чем событие Click (так как клик, возможно, не приземлился на флажке). Но в любом случае событие запускается до того, как свойство Checked изменится на CheckBox, поэтому вы не можете установить разрешенные состояния в любом из этих обработчиков событий. Вы можете, однако, отложить обработку до тех пор, пока события обрабатываются с помощью BeginInvoke, как это:

private void clbEmailsSubjects_ItemCheck(object sender, ItemCheckEventArgs e) 
{ 
    BeginInvoke((Action)(() => 
    { 
     btnEdit.Enabled = btnDelete.Enabled = 
      (clbEmailsSubjects.CheckedItems.Count == 1); 
    })); 
} 
+0

Он работает даже с событием Click. Благодарю. Я должен был сделать явное преобразование: BeginInvoke ((Action) (() => { btnEdit.Enabled = btnDelete.Enabled = (clbEmailsSubjects.CheckedItems.Count == 1); })); – Andrei

+0

Я думаю, что последняя часть вашего комментария съелась. Но я добавил явное преобразование в метод MethodInvoker, который, я думаю, является тем, о чем вы говорили. – adv12

+2

Хорошо, я изменил 'MethodInvoker' на' Action' в соответствии с вашим комментарием. Либо надо работать. – adv12

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); 
    } 
Смежные вопросы