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

时间:2014-11-18 16:11:27

标签: c# winforms listbox

所以,我有:

Listbox l = new Listbox();

private ListBox.ObjectCollection _collection = new ListBox.ObjectCollection( l );

这是因为我希望列表框可以搜索,这意味着您可以通过键入文本字段来过滤掉项目,我需要两个不同的集合来执行此操作,列表框中绘制的正常列表框项列表和原作'数据源。我的工作非常顺利。 但是,在_collection上调用.Clear()方法时,有时会出现以下异常:

Object reference not set to an instance of an object.

并且callstack看起来像这样:

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方法中排序,导致_collection以某种方式尝试清除.Items集合中不再存在的项目。我该怎么办?

这可能是实施我感兴趣的错误方式,所以我也愿意接受这方面的建议。

编辑: 02 / 12-12 根据评论,订购已经被关闭,我已经尝试确定它何时发生,但这几乎是不可能的,因为它似乎需要一些随机组合的其他文本框,组合框,点击一点用鼠标然后最后在列表框中选择一些东西。 根据此link的第3094 - 3110行,clearInternal似乎检查列表框所有者的计数,然后从其InnerArray中删除相同数量的项目。我正在思考这是否是为什么它试图删除InnerArray中实际不存在的元素,导致空引用。但似乎两个集合中的每一个都应该检查相同的列表框并相应地删除项目。 _collection可能包含比列表框更多的项目,但是它应该只是尝试删除与列表框中相同的数量,并且最终不会被清除,它不应该尝试删除不是列表框的元素。存在。

15年9月6日 仍然是一个问题,我最近一直试图深入研究它,但我已经没有想法试试我的运气了。还有其他人吗?

1 个答案:

答案 0 :(得分:1)

根据您显示的内容,ListBox l未初始化,因此集合上的.Clear()会抛出NullReferenceException

实例化ListBox以解决问题:

ListBox l = new ListBox();

顺便说一下,我测试了这个,而不是理论化。