2017-09-27 13 views
1

5つのチェックボックスを持つcheckedListBoxがあり、最初のものを "すべて"にします。 私はこのコードを書いたが、私は無限ループを取得しています:CheckBox(C#winForms)の他のすべてのチェックボックスをチェック/チェック解除する1つのチェックボックス

private void chkLstBx_ItemCheck(object sender, ItemCheckEventArgs e) 
{ 
    // ----- Get the name of the CheckBox that's changed: ----- 
    string selected = chkLstBx.SelectedItem + ""; 
    // ----- If "All" changed: ----- 
    if (selected.Equals("All")) 
     // ----- to TRUE(from unchecked): ----- 
     if (("" + (chkLstBx.GetItemCheckState(0))).Equals("Unchecked")) 
      for (int i = 1; i < chkLstBx.Items.Count; i++) 
       **chkLstBx.SetItemChecked(i, true);** 
     else // ----- to FALSE(from checked): ----- 
      for (int i = 1; i < chkLstBx.Items.Count; i++) 
       chkLstBx.SetItemChecked(i, false); 
// ----------------------------------------------- 
// -------------- REST OF CODE HERE -------------- 
// ----------------------------------------------- 
} 

太線(**)は、残念ながら再帰的に...選択した無限ループになる...再び「chkLstBx_ItemCheck」のコール常に「すべて」であり、まだ「未チェック」であり、iはもう一度1から始まります。 どうすればこの問題を解決できますか?

答えて

2

このコードでは、リストの最初の項目がAllという項目として使用されています。これは良い方法ですが、より良い方法は、すべてのアイテムの参照を保持し、それを使用してイベントハンドラでチェックされているアイテムを確認することです。

private void chkLstBx_ItemCheck(object sender, ItemCheckEventArgs e) 
{ 
    if (e.Index == 0) 
    { 
     if (e.NewValue == CheckState.Checked) 
      ChangeAllCheckBoxValues(true); 
     else 
      ChangeAllCheckBoxValues(false); 
    } 
} 

private void ChangeAllCheckBoxValues(bool value) 
{ 
    for (int i = 1; i < chkLstBx.Items.Count; i++) 
    { 
     chkLstBx.SetItemChecked(i, value); 
    } 
} 
+1

あなたは男です:)働いて! "もっと良いのは、すべてのアイテムの参照を保持することです" これは理想的ですが、特定のcheckedListBoxはCheckBoxへの参照を個別に許可しないため、回避する必要がありました。 –

0

私は私の心に来るあなたのコードと2つのことを見てみました:

1)ビーイングがItemCheckのために結合がある理由はchkListBxはなく、特定の行に反対しました、特定の行の項目チェックを変更しているときに、このメソッドを再度呼び出して、選択した値が何かを検索し、メソッドを再度呼び出します。私はそれが 'SelectedIndexChanged'へのバインディングを変更することで動作させることができましたが、あなたのコードの残りの部分で動作するかどうかを確認する必要があります。

2)バインディングを 'SelectedIndexChanged'に変更すると、私は持っている振る舞いが少し違っていました(つまり、Allはまだチェックされておらず、他のチェックボックスはすべてチェックされています)。その理由は、それが以前にチェックされていなかったときに - クリックしたときに値が「Checked」に設定されたため、評価されたときにその値がチェックされたとみなされ、すべてunselectになります。

NB:サイドノートでは、その優れたが、常にあなたが内にあることが意図二行を追加しますので、場合でも、

for (int i = 1; i < chkLstBx.Items.Count; i++) 
{ 
    chkLstBx.SetItemChecked(i, false); 
} 

for (int i = 1; i < chkLstBx.Items.Count; i++) 
      chkLstBx.SetItemChecked(i, false); 

単一ラインの中括弧を持っていますループが発生すると、プログラムがまだコンパイルされていて、どこに問題が見つからないかについて、中括弧を追加するのを忘れるかもしれません。

関連する問題