2

CheckedListBoxaと aの 2 つの要素を含むフォームがありますCheckBoxCheckBoxと呼ばれる は、 内のSelectAllCheckBoxすべての項目をチェック/チェック解除するために使用されCheckedListBoxます。CheckedChangedに関連付けられたイベント ハンドラーを介してこれを実現し、SelectAllCheckBoxチェックすると のすべての項目CheckedListBoxがチェックされ、その逆も同様です。これはうまくいきます。

ユーザーSelectAllCheckBoxCheckedListBox. たとえば、ユーザーがSelectAllCheckBoxをオンにしてから項目の 1 つをオフにした場合、[すべて選択]CheckBoxをオフにする必要があります。これは、CheckedListBox.ItemCheckedイベント ハンドラを介して実現されます。これもうまくいきます。

私の問題は、SelectAllCheckBox(上記のシナリオのように) プログラムで がチェックされていない場合、そのイベント ハンドラーによって 内のすべての項目CheckedListBoxがチェックされなくなることです。

他の人が私の問題に遭遇したと確信しています。エレガントな回避策はありますか?

4

2 に答える 2

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別のアプローチとして、 andなどの別の種類のイベントを試すことができます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 {
     //....
   }
}
于 2013-08-20T16:15:18.103 に答える
2

別の方法は、プログラムでチェック/チェックを外すと、チェックボックスにフォーカスが移らないという事実を利用することです。Focusedしたがって、プロパティをフラグとして使用できます。

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

別の個別の bool フラグを作成する必要はありません (フォーカス状態をどこかで手動で変更する場合を除きます)。

于 2013-08-20T17:37:22.140 に答える