项目已检查事件处理程序

本文关键字:程序 事件处理 检查 项目 | 更新日期: 2023-09-27 18:34:53

我使用以下代码将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);
        }
    }

项目已检查事件处理程序

您可以创建一个新变量,指示何时应忽略 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;
    }
}

这应该清除所有选中的项目:

 public void UncheckCheckBoxItems(CheckBoxList cbl)
 {
     foreach (ListItem item in cbl.Items)
     {
         item.Selected = false;
     }
 }

最简单的方法是断开 ItemChecked 事件处理程序的连接,执行取消选中,然后重新连接事件处理程序。这样,当您调用 SetItemCheck 时,不会触发任何 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 很重要,因为在出现异常时,您的事件处理程序将被重新连接。