2010-12-20 66 views
4

我想在C#中的WinForms使用BindingList作为DataSourceListBox,但每当我尝试添加项目到BindingList时抛出ArgumentOutOfRangeException,我得到抛出的ArgumentOutOfRangeException。下面的代码演示了此问题(假设形式ListBox listBox1):列表框添加到数据源

BindingList<string> dataSource = new BindingList<string>(); 
listBox1.DataSource = dataSource; 
dataSource.Add("Test1"); // Exception, here. 

注意,如果dataSource中已经有项目,我没有得到异常:

BindingList<string> dataSource = new BindingList<string>(); 
dataSource.Add("Test1"); 
listBox1.DataSource = dataSource; 
dataSource.Add("Test2"); // Appears to work correctly. 

我可以解决通过在添加项目之前将DataSource属性设置为null并在之后重新设置DataSource,但感觉像是黑客,我希望能够避免这样做。

ListBox上使用空的DataSource是否存在(非黑客)方法,以便向其添加项目不会引发异常?

编辑:堆栈跟踪:

System.Windows.Forms.dll的System.Windows.Forms.ListBox.SelectedIndex.set(INT 值)+为0x1EC字节
System.Windows。 Forms.dll!System.Windows.Forms.ListControl.DataManager_PositionChanged(object sender,System.EventArgs e)+ 0x2e bytes
System.Windows.Forms.dll!System.Windows.Forms.CurrencyManager.OnPositionChanged(System.EventArgs e)+ 0x39字节
System.Windows.Forms.dll的!System.Windows.Forms.CurrencyManager.ChangeRecordState(INT 在newPosition,布尔验证,布尔 endCurrentEdit,布尔 firePositionChange,布尔pullData)+ 0x14f字节
System.Windows.Forms的。 dll的!System.Windows.Forms.CurrencyManager.List_ListChanged(对象 发件人, System.ComponentModel.ListChangedEventArgs E)+ 0x2e4字节
System.dll中!System.ComponentModel.BindingList.OnListChanged(System.ComponentModel.ListChangedEventArgs E) + 0x17字节
System.dll!System.ComponentModel.BindingList.FireListChang ED(System.ComponentModel.ListChangedType 类型,INT指数)+ 0x35字节
System.dll中!System.ComponentModel.BindingList.InsertItem(INT 索引,系统_ 佳能项)+ 0x3F的 字节
mscorlib.dll中!System.Collections.ObjectModel.Collection.Add(系统。
_Canon 项)+ 0x76字节

+0

没有repro,发布异常的堆栈跟踪。 – 2010-12-20 20:15:23

+1

我感觉有点愚蠢 - 这是.Net在内部处理的一个例外;我的调试器被设置为触发所有抛出的异常。下一次,我会确保“继续”,直到遇到实际的崩溃。 – TreDubZedd 2010-12-20 21:17:02

回答

2

事实证明,我已经在“例外”对话框(调试 - >例外)中检查了一切。所以,这个异常存在,但是(默默地)由.Net框架处理。继续执行程序会显示预期的结果。

0

你可能有附加的一些事情对你ListBox可能会造成此事件处理程序?我无法重现您所描述的行为。

我创建了一个完全空白的WinForms项目,以及绑定到一个BindingList<string>ListBox,增值“测试”列表(设置ListBox.DataSource属性之后),以及该项目的“测试”出现在框中,作为预期。

我想看看你的ListBox以及你的BindingList<string>,看看是否有一个你可能会失踪的附加事件处理程序。

+0

我的问题存在于看起来与您所描述的配置相同的配置中,即具有单个ListBox的全新WinForms项目;没有无关的事件处理程序。 – TreDubZedd 2010-12-20 21:05:19

+0

@TreDubZedd:这是一个标准的'System.Windows.Forms.ListBox'?目前我和汉斯在一起 - 不能再现你所看到的。堆栈跟踪肯定会有帮助。 – 2010-12-20 21:08:39

+0

看起来它是.Net在内部处理的一个例外。哎呀。 – TreDubZedd 2010-12-20 21:15:39

0

我有同样的问题,经过多次研究,我发现避免这种.Net错误的唯一解决方法是在列表不为空时仅将BindingList分配给DataSource。

如果可以更改,可以制作一个虚拟对象,您始终保留在列表中,并且在列表不为空时将其删除。

最后,它不值得找到一种方法来避免ArgumentOutOfRangeException被抛出。