2013-08-20 3 views
2

У меня есть форма, которая содержит два элемента: a CheckedListBox и CheckBox. CheckBox, который называется SelectAllCheckBox, используется для проверки/снятия всех элементов в CheckedListBox. Я достигаю этого с помощью обработчика событий CheckedChanged, связанного с SelectAllCheckBox, так что когда он установлен, все элементы в CheckedListBox проверяются и наоборот. Это прекрасно работает.Выбрать все флажок и CheckedListBox

У меня также есть код, который отменяет SelectAllCheckBox, когда пользователь снимает флажки с одного из CheckBoxes в CheckedListBox. Например, если пользователь проверяет SelectAllCheckBox, а затем снимает флажки с одного из элементов, Select All CheckBox должен быть снят. Это достигается с помощью обработчика событий CheckedListBox.ItemChecked. Это также отлично работает.

Моя проблема заключается в том, что когда SelectAllCheckBox программно не отмечен (как в вышеприведенном сценарии), его обработчик событий вызывает снятие всех элементов в CheckedListBox.

Я уверен, что другие столкнулись с моей проблемой; есть ли элегантный обход?

+0

Могли бы, пожалуйста, опубликовать некоторые из ваших кодов, с которыми мы работаем? – Khan

+0

код будет полезным – Ehsan

ответ

2

Другой способ заключается в использовании тот факт, что когда вы программно проверяете/снимаете флажок, он не дает фокуса этому флажку. Таким образом, вы можете использовать свойство Focused как флаг.

private void SelectAllCheckBox_CheckedChanged(object sender, EventArgs e) 
{ 
    if(!((CheckBox)sender).Focused) 
     return; 
    //your code to uncheck/check all CheckedListBox here 
} 

Не нужно создавать другой отдельный флаг bool (если только вы не вручную меняете состояние фокусировки).

+0

Clever. Это то, что я искал - способ различать программную и пользовательскую проверку. –

2

Вы можете использовать некоторый флаг:

bool suppressCheckedChanged; 
private void SelectAllCheckBox_CheckedChanged(object sender, EventArgs e){ 
    if(suppressCheckedChanged) return; 
    //your code here 
    //.... 
} 
//Then whenever you want to programmatically change the Checked of your SelectAllCheckBox 
//you can do something like this 
suppressCheckedChanged = true; 
SelectAllCheckBox.Checked = false; 
suppressCheckedChanged = false; 

Другой подход вы можете попробовать другой вид события, такие как Click и DoubleClick (необходимо использовать оба):

private void SelectAllCheckBox_Click(object sender, EventArgs e){ 
    DoStuff(); 
} 
private void SelectAllCheckBox_DoubleClick(object sender, EventArgs e){ 
    DoStuff(); 
} 
private void DoStuff(){ 
    //your code here; 
    if(SelectAllCheckBox.Checked){ 
     //.... 
    } 
    else { 
    //.... 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^