Windows C# CheckedListBox Обработка событий проверенных элементов

В настоящее время я разрабатываю приложение Window, которое использует CheckedListBoxes для определенных аспектов программы. Проблема, с которой я столкнулся, заключается в том, что я пытался определить, какое событие вызывается при проверке элемента, чтобы я мог включить кнопку формы при проверке любого элемента списка.

Проблема в том, что я пытался использовать следующее;

private void clbAvailMods_ItemCheck(object sender, ItemCheckEventArgs e)
    {
        if(e.NewValue == CheckState.Checked)
        {
            btnInstall.Enabled = true;
        }
    }

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

Я что-то здесь не так делаю?

5 ответов

Решение

Стандартный прием Windows Forms - отложить выполнение кода до тех пор, пока не будут завершены все побочные эффекты событий. Вы задерживаете выполнение кода с помощью метода Control.BeginInvoke(). Это исправит вашу проблему:

    private void checkedListBox1_SelectedIndexChanged(object sender, EventArgs e) {
        this.BeginInvoke(new MethodInvoker(evalList), null);
    }

    private void evalList() {
        bool any = false;
        for (int ix = 0; ix < checkedListBox1.Items.Count; ++ix) {
            if (checkedListBox1.GetItemChecked(ix)) {
                any = true;
                break;
            }
        }
        btnInstall.Enabled = any;
    }

Вы можете использовать свойство NewValue для ручного обновления CheckedItems.Count. Это код, который я использую для включения кнопки, только когда проверен хотя бы один элемент:

private void checkedListBoxProds_ItemCheck(object sender, ItemCheckEventArgs e)
{
    this.buttonGenerar.Enabled = ((this.checkedListBoxProds.CheckedItems.Count + (e.NewValue == CheckState.Checked ? 1 : -1)) > 0);
}

Я знаю, что на это уже давно дан ответ, но мне было проще обрабатывать события MouseUp и KeyUp. Свойство CheckedItems.Count является точным при срабатывании этих событий. Поскольку они оба делают одно и то же, я создал метод для работы и вызвал этот метод из обоих обработчиков событий.

private void clbFolders_KeyUp(object sender, KeyEventArgs e) { Update(); }
private void clbFolders_MouseUp(object sender, MouseEventArgs e) { Update(); }

private void Update()
{
    btnDelete.Enabled = clbFolders.CheckedItems.Count > 0;
}

Я думаю, что это событие SelectedIndexChanged, но я подтвердлю прямо сейчас.

РЕДАКТИРОВАТЬ: событие SelectedIndexChanged работает. Но это срабатывает независимо от того, был ли установлен флажок. Поэтому я бы проверил проверенное состояние, если вы хотите это сделать.

Но в качестве отдельного случая, когда я использовал событие ItemCheck, оно сработало, когда я фактически установил флажок, а не только текст.

Пара потенциальных ошибок. Предположительно, вы добавили событие через графический интерфейс VS.Net, чтобы обеспечить его включение в элемент управления. Попробуйте дважды щелкнуть элемент - один раз, чтобы выделить элемент, и снова переключить состояние проверки - если вы хотите, чтобы элемент проверял состояние проверки при первом щелчке, затем установите для свойства "CheckOnClick" значение true.

Другие вопросы по тегам