ItemCheck 事件后清除 CheckedListBox

在我用 C# 编写的 windows 窗体项目中,我尝试在检查最后一个项目后清除 CheckedListBox。


private void checkedListBox1_ItemCheck(object sender, ItemCheckEventArgs e)

{

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

    {

        checkedListBox1.Items.Clear();

    }

}

在此示例中,在我检查最后一项后,程序将抛出 NullReferenceException。


有人可以解释为什么会发生这种情况以及我该如何处理吗?


提前致谢!


慕仙森
浏览 360回答 2
2回答

鸿蒙传说

更改您的代码以在项目的检查状态更新后运行逻辑: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我们在检查状态更新后延迟运行代码。您可以在这篇文章中阅读更多相关信息。

慕村9548890

这是因为在您从 中清除项目后checklistbox,有一些内部调用 ( System.Windows.Forms.CheckedListBox.CheckedItemCollection.SetCheckedState) 稍后会调用并且仍然对项目进行操作。所以它抛出NullReferenceException.如果您SelectedIndexChanged改为注册事件,则可以清除项目而不会出现此问题。不同的是时机,ItemCheck触发的比较早,那个时候不能清项目,SelectedIndexChanged触发的比较晚。
打开App,查看更多内容
随时随地看视频慕课网APP