Windows C # CheckedListBox Обработка событий проверенных элементов - PullRequest
7 голосов
/ 06 июля 2010

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

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

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

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

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

Ответы [ 5 ]

20 голосов
/ 06 июля 2010

Стандартный прием 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;
    }
2 голосов
/ 13 сентября 2010

Вы можете использовать свойство 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);
}
0 голосов
/ 04 февраля 2017

Я знаю, что на это уже давно дан ответ, но мне было проще просто обрабатывать события 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;
}
0 голосов
/ 06 июля 2010

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

EDIT: событие SelectedIndexChanged работает.Но это срабатывает независимо от того, был ли установлен флажок.Так что я бы тогда проверил проверенное состояние, если вы хотите это сделать.

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

0 голосов
/ 06 июля 2010

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

...