C# 使用两个不同项目集合的可搜索列表框

C# 使用两个不同项目集合的可搜索列表框,c#,winforms,listbox,C#,Winforms,Listbox,因此,我: Listbox l = new Listbox(); 及 这是因为我希望列表框是可搜索的,这意味着您可以通过在文本字段中键入来过滤项目,我需要两个不同的集合来完成此操作,由列表框绘制的普通列表框项目列表和“原始”数据源。我的工作做得很好。 但是,在对_集合调用.Clear()方法时,有时会出现以下异常: Object reference not set to an instance of an object. 调用堆栈看起来是这样的: at System.Windows.Form

因此,我:

Listbox l = new Listbox();

这是因为我希望列表框是可搜索的,这意味着您可以通过在文本字段中键入来过滤项目,我需要两个不同的集合来完成此操作,由列表框绘制的普通列表框项目列表和“原始”数据源。我的工作做得很好。 但是,在对_集合调用.Clear()方法时,有时会出现以下异常:

Object reference not set to an instance of an object.
调用堆栈看起来是这样的:

at System.Windows.Forms.ListBox.ItemArray.GetItem(Int32 virtualIndex, Int32 stateMask)
at System.Windows.Forms.ListBox.ObjectCollection.ClearInternal()
at System.Windows.Forms.ListBox.ObjectCollection.Clear()
我能想象的唯一情况是,Listbox的实际ObjectCollection中的某些项已从.items列表和Listbox.ObjectCollection的Clear方法中排序出来,导致_集合以某种方式试图清除.items集合中不再存在的项。我能做什么

这可能是实现我感兴趣的内容的错误方法,因此我也愿意接受这方面的建议

编辑: 02/12-12 根据评论,排序已经被关闭,我已经尝试准确地计算出它发生的时间,但这几乎是不可能的,因为它似乎需要一些来自其他文本框、组合框的值的随机组合,用鼠标点击一点,然后最后在列表框中选择一些内容。 根据本文的第3094-3110行,clearInternal似乎检查listbox所有者的计数,然后从其InnerArray中删除相同数量的项。我在思考这是否就是为什么它试图删除InnerArray中实际上不存在的元素,从而导致空引用的原因。但似乎两个集合中的每一个都应该选中相同的列表框并相应地删除项目。_集合的项可能比列表框中的项多,但它只应尝试删除与列表框中相同的项,并且最终不会被清除,它不应尝试删除不存在的元素

2015年6月9日
这仍然是一个问题,我最近一直在努力深入研究,但我已经没有办法尝试我的运气了。其他人得到了吗?

从您显示的内容来看,
列表框
l
没有初始化,因此集合上的
.Clear()
正在抛出一个
NullReferenceException

实例化
列表框
,以解决此问题:

ListBox l = new ListBox();

顺便说一句,我测试了这一点,而不是理论。

呃,我真希望我已经病了好几天没有看到这个答案。这与此无关,我只是没有显示初始化代码。它比这个更深。您可以在调用Clear()之前尝试删除排序
ListBox l = new ListBox();