为了账号安全,请及时绑定邮箱和手机立即绑定

ItemCheck 事件后清除 CheckedListBox

ItemCheck 事件后清除 CheckedListBox

C#
慕仙森 2022-01-09 15:42:40
在我用 C# 编写的 windows 窗体项目中,我尝试在检查最后一个项目后清除 CheckedListBox。private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e){    if (checkedListBox1.CheckedItems.Count + 1 == checkedListBox1.Items.Count)    {        checkedListBox1.Items.Clear();    }}在此示例中,在我检查最后一项后,程序将抛出 NullReferenceException。有人可以解释为什么会发生这种情况以及我该如何处理吗?提前致谢!
查看完整描述

2 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

更改您的代码以在项目的检查状态更新后运行逻辑:


private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)

{

    checkedListBox1.BeginInvoke(new Action(() =>

    {

        if (checkedListBox1.CheckedItems.Count == checkedListBox1.Items.Count)

        {

            checkedListBox1.Items.Clear();

        }

    }));

}

根据文档,默认情况下,当ItemCheck事件引发时,项目的检查状态直到ItemCheck事件发生后才会更新。这意味着它会在运行事件处理程序中的代码后尝试更新项目的检查状态。因此,在您的代码中,它会在从项目集合中删除项目后尝试更新项目检查状态,这就是发生异常的原因。您可以在堆栈跟踪中看到发生了什么,也可以在控件的源代码中看到。


在上面的代码中,使用BeginInvoke我们在检查状态更新后延迟运行代码。您可以在这篇文章中阅读更多相关信息。


查看完整回答
反对 回复 2022-01-09
?
慕村9548890

TA贡献1884条经验 获得超4个赞

这是因为在您从 中清除项目后checklistbox,有一些内部调用 ( System.Windows.Forms.CheckedListBox.CheckedItemCollection.SetCheckedState) 稍后会调用并且仍然对项目进行操作。所以它抛出NullReferenceException.

如果您SelectedIndexChanged改为注册事件,则可以清除项目而不会出现此问题。

不同的是时机,ItemCheck触发的比较早,那个时候不能清项目,SelectedIndexChanged触发的比较晚。


查看完整回答
反对 回复 2022-01-09
  • 2 回答
  • 0 关注
  • 359 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信