Событие CheckedListBox * после изменения * CheckState - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть элемент управления CheckedListBox и кнопка в моем проекте WinForms. Он содержит список элементов, и можно выбрать максимум 5. Я использую событие ItemCheck, поэтому каждый раз, когда пользователь проверяет или снимает отметку с элемента в списке, вызывается функция, которая снимает отметку с последнего значения, если общее количество выбранных элементов было больше 5:

private void NumbersListItemChecked(object sender, ItemCheckEventArgs e)
{
    CheckedListBox checkedItems = (CheckedListBox)sender;
    if (checkedItems.CheckedItems.Count > 4)
    {
        e.NewValue = CheckState.Unchecked;
    }
    RefreshButtonState();
}

Таким образом, количество отмеченных элементов никогда не будет превышать 5.

Предполагается, что элемент управления кнопки будет отключен, если количество отмеченных элементов в моем CheckedListBox не равно 5, и включено, если оно есть. Я пытаюсь вызвать эту функцию всякий раз, когда происходит изменение в состоянии:

private void RefreshButtonState()
{
    if (NumbersList.CheckedItems.Count == 5)
    {
         ModifyButton.Enabled = true;
    }
    else
    {
        ModifyButton.Enabled = false;
    }
}

Однако кнопка остается отключенной, даже если у меня проверено 5 пунктов, пока я не попытаюсь проверить шестой, и наоборот - если Я проверяю 5, а затем снимаю галочку, кнопка станет активной. Я знаю, что это происходит потому, что функция вызывается до фактического изменения.

Есть ли событие для CheckedListBox, которое вызывается сразу после изменения состояния, а не когда изменить?

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Вам не нужно другое событие, просто обработайте ItemChecked и используйте e.NewValue, чтобы получить количество проверенных элементов после , когда CheckState изменяется, а не когда ItemChecked событие возбуждено.

private void NumbersListItemChecked(object sender, ItemCheckEventArgs e)
{
    var s = sender as CheckedListBox;
    var count = s.CheckedIndices.Count + (e.NewValue == CheckState.Checked ? 1 : -1);

    if (count > 5)
        e.NewValue = CheckState.Unchecked;

    ModifyButton.Enabled = count >= 5;
}
0 голосов
/ 14 апреля 2020

Используйте событие ItemCheck и проверьте новое состояние элемента, который был проверен. Новое состояние в событии arg как e.NewValue. Вы можете проверить состояние в if (e.NewValue == CheckState.Check) и использовать его в своей логике c.

...