Windows C# CheckedListBox Обработка событий CheckedListBox Checked Item

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

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

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

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

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


person rik_davis    schedule 05.07.2010    source источник
comment
Похоже, что в конструкторе форм было неправильно зарегистрировано событие ItemCheck. Это устранило основную проблему, но теперь возникла новая, которая кажется более расплывчатой ​​в своем контексте. По-видимому, состояние отмеченного элемента не обновляется до завершения ItemCheck. Это плохо, так как мне нужно, чтобы первый элемент проверил, чтобы запустить реализованный код. Так как состояние не обновляется до тех пор, пока не происходит обновление, я теряю немедленную регистрацию срабатывания события проверки элемента.   -  person rik_davis    schedule 06.07.2010


Ответы (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;
    }
person Hans Passant    schedule 05.07.2010
comment
Я определенно рассмотрю это предложение больше. Кажется, что на бумаге (экране) он находится на правильном пути. :) Спасибо, Ганс. - person rik_davis; 06.07.2010
comment
Думаю, это будет именно тот билет, который я искал. Спасибо за помощь! :) - person rik_davis; 07.07.2010
comment
Это сработало для меня с комбинированным решением dodgy_coder: stackoverflow.com/questions/545533/delayed-function-calls. Просто добавьте метод foo в свой код, а затем измените эту строку на this.BeginInvoke(new MethodInvoker(foo), null); и, наконец, внутри foo вызовите evalList вместо bar(); - person Robert Smith; 22.09.2016
comment
Событие SelectedIndexChanged не запускается, если флажок установлен с помощью клавиши пробела. - person Elmue; 13.04.2019

Вы можете использовать свойство 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);
}
person Sergio DomingoHernando    schedule 13.09.2010

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

person Will A    schedule 05.07.2010
comment
У меня уже установлено значение CheckOnClick в значение true. Я заметил, что Microsnot, похоже, упустили из виду довольно важный элемент дизайна в этом случае. Они позволят вам установить, что НАМЕРЕНО изменить, но не будут инициировать какие-либо события после того, как изменение будет завершено. Я должен сказать, что этим дебилам в MS может потребоваться отладчик на поллюции. - person rik_davis; 06.07.2010

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

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

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

person spinon    schedule 05.07.2010
comment
Да, ItemCheck срабатывает, когда вы устанавливаете флажок. Настоящая проблема заключается в том, что состояние vhecked этого флажка по-прежнему будет противоположным тому, что было до щелчка по нему, до тех пор, пока не завершится обработка ItemCheck. Следовательно, настоящая дилемма заключается в попытке увидеть, действительно ли флажок установлен или снят в режиме реального времени. то есть необходимость события ItemCheckChanged. - person rik_davis; 06.07.2010
comment
Значит, нельзя просто проверить обратное? Если событие itemcheck срабатывает, а флажок не установлен, это означает, что он будет проверен правильно? - person spinon; 06.07.2010

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