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.