Как связать свойство 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);
    }
Другие вопросы по тегам