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我们在检查状态更新后延迟运行代码。您可以在这篇文章中阅读更多相关信息。
TA贡献1884条经验 获得超4个赞
这是因为在您从 中清除项目后checklistbox
,有一些内部调用 ( System.Windows.Forms.CheckedListBox.CheckedItemCollection.SetCheckedState
) 稍后会调用并且仍然对项目进行操作。所以它抛出NullReferenceException
.
如果您SelectedIndexChanged
改为注册事件,则可以清除项目而不会出现此问题。
不同的是时机,ItemCheck
触发的比较早,那个时候不能清项目,SelectedIndexChanged
触发的比较晚。
- 2 回答
- 0 关注
- 359 浏览
添加回答
举报