【发布时间】:2015-06-09 16:51:14
【问题描述】:
所以,我有:
Listbox l = new Listbox();
和
private ListBox.ObjectCollection _collection = new ListBox.ObjectCollection( l );
这是因为我希望列表框是可搜索的,这意味着您可以通过在文本字段中输入来过滤掉项目,我需要两个不同的集合来执行此操作,由列表框绘制的普通列表框项目列表和“原始列表” ' 数据源。我有这个工作得很好。 但是,在 _collection 上调用 .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 方法中排序,导致 _collection 以某种方式试图清除 .Items 集合中不再存在的项目。我能做什么?
这可能是实现我感兴趣的错误的方法,所以我也愿意接受建议。
编辑: 02/12-12 根据评论,订购已经关闭,我试图弄清楚它发生的确切时间,但这几乎是不可能的,因为它似乎需要来自其他文本框、组合框的值的一些随机组合,用鼠标点击一点,然后最后在列表框中选择一些东西。 根据link 的第 3094 - 3110 行,clearInternal 似乎检查了列表框所有者的计数,然后从其 InnerArray 中删除了相同数量的项目。我在思考这是否是它试图删除 InnerArray 中实际不存在的元素的原因,从而导致空引用。但似乎这两个集合中的每一个都应该检查同一个列表框并相应地删除项目。 _collection 可能比列表框有更多的项目,但是它应该只是尝试删除与列表框中相同的数量并且最终不会被清除,它不应该尝试删除不存在的元素。
09/06/15 仍然是一个问题,我最近一直试图深入研究它,但我已经没有想法来试试我的运气了。其他人有吗?
【问题讨论】:
-
您可以尝试在调用 Clear() 之前删除排序