2

次のコードを使用して、CheckedListBox 内のチェック済みアイテムの数を 1 に制限しています。

        private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
    {
        if (checkedListBox1.CheckedItems.Count == 1)
        {
            Boolean isCheckedItemBeingUnchecked = (e.CurrentValue == CheckState.Checked);
            if (isCheckedItemBeingUnchecked)
            {
                e.NewValue = CheckState.Checked;
            }
            else
            {
                Int32 checkedItemIndex = checkedListBox1.CheckedIndices[0];
                checkedListBox1.ItemCheck -= checkedListBox1_ItemCheck;
                checkedListBox1.SetItemChecked(checkedItemIndex, false);
                checkedListBox1.ItemCheck += checkedListBox1_ItemCheck;
            }
            return;
        }
    }

しかし、チェックした項目をすべてクリアする必要がある場合があります。以下のコードを使用してそれを実行しようとしていますが、前のイベントが原因でそれが機能していません。どうすればそれを達成できますか?ありがとう。

    public void ClearChecked()
    {
        foreach (int checkedItemIndex in checkedListBox1.CheckedIndices)
        {
            checkedListBox1.SetItemChecked(checkedItemIndex, false);
        }
    }
4

3 に答える 3

2

ItemCheck イベントをいつ無視するかを示す新しい変数を作成できます。

private shouldIgnoreCheckEvent;

public void ClearChecked()
{
    this.shouldIgnoreCheckEvent = true;

    foreach (int checkedItemIndex in checkedListBox1.CheckedIndices)
    {
        checkedListBox1.SetItemChecked(checkedItemIndex, false);
    }

    this.shouldIgnoreCheckEvent = false;
}

ItemCheck メソッドを更新して、無視する必要があるかどうかを確認します。

private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)
{
    if (!this.shouldIgnoreCheckEvent && checkedListBox1.CheckedItems.Count == 1)
    {
        Boolean isCheckedItemBeingUnchecked = (e.CurrentValue == CheckState.Checked);
        if (isCheckedItemBeingUnchecked)
        {
            e.NewValue = CheckState.Checked;
        }
        else
        {
            Int32 checkedItemIndex = checkedListBox1.CheckedIndices[0];
            checkedListBox1.ItemCheck -= checkedListBox1_ItemCheck;
            checkedListBox1.SetItemChecked(checkedItemIndex, false);
            checkedListBox1.ItemCheck += checkedListBox1_ItemCheck;
        }
        return;
    }
}
于 2012-05-22T13:24:35.633 に答える
2

これにより、チェックされたすべての項目がクリアされます。

 public void UncheckCheckBoxItems(CheckBoxList cbl)
 {
     foreach (ListItem item in cbl.Items)
     {
         item.Selected = false;
     }
 }
于 2012-05-22T13:28:17.913 に答える
1

最も簡単な方法は、ItemChecked イベント ハンドラーを切断し、チェックを解除してから、イベント ハンドラーを再接続することです。このように、SetItemChecked を呼び出すと、ItemChecked イベントは発生せず、イベント ハンドラーを制御するための追加のコードは必要ありません。ItemCheck イベント内で既にこのパターンを使用していることに気付きました。

public void ClearChecked()     
{         
     try
     {
         checkedListBox1.ItemCheck -= checkedListBox1_ItemCheck;
         foreach (int checkedItemIndex in checkedListBox1.CheckedIndices)         
         {             
             checkedListBox1.SetItemChecked(checkedItemIndex, false);         
         }
     }
     finally
     {
         checkedListBox1.ItemCheck += checkedListBox1_ItemCheck;

     }     
} 

例外が発生した場合、イベント ハンドラーが再接続されるため、try/finally は重要です。

于 2012-05-22T13:34:56.310 に答える