我正在尝试使用BindingList
作为DataSource
用于C#WinForms中的ListBox
,但每当我尝试向BindingList
添加项目时,我都会得到一个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
来解决此问题,但这感觉就像是黑客,而我我希望能够避免这样做。
是否有(非黑客)方式在DataSource
上使用空ListBox
,这样向其添加项目不会抛出异常?
编辑:堆栈跟踪:
System.Windows.Forms.dll中!System.Windows.Forms.ListBox.SelectedIndex.set(INT 值)+ 0x1ec字节
System.Windows.Forms.dll中!System.Windows.Forms.ListControl.DataManager_PositionChanged(对象 sender,System.EventArgs e)+ 0x2e 字节
System.Windows.Forms.dll中!System.Windows.Forms.CurrencyManager.OnPositionChanged(System.EventArgs e)+ 0x39字节
System.Windows.Forms.dll中!System.Windows.Forms.CurrencyManager.ChangeRecordState(INT newPosition,bool验证,bool endCurrentEdit,bool firePositionChange,bool 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.FireListChanged(System.ComponentModel.ListChangedType type,int index)+ 0x35 bytes
System.dll中!System.ComponentModel.BindingList.InsertItem(INT index,System ._ Canon item)+ 0x3f 字节
mscorlib.dll中!System.Collections.ObjectModel.Collection.Add(系统。的_Canon item)+ 0x76 bytes
答案 0 :(得分:2)
事实证明我在“例外”对话框中检查了所有内容(Debug-&gt; Exceptions)。因此,异常存在,但是(由#Net)框架(静默地)处理。持续的程序执行会显示预期的结果。
答案 1 :(得分:0)
您是否可能在ListBox
上的某个事件上附加了一个事件处理程序,可能导致此问题?我无法重现你所描述的行为。
我创建了一个完全空白的WinForms项目,其中一个ListBox
绑定到BindingList<string>
,将值“Test”添加到列表中(在设置ListBox.DataSource
属性之后),以及正如预期的那样,“测试”项出现在框中。
我会查看您的ListBox
以及您的BindingList<string>
,看看是否有一个附加的事件处理程序可能会丢失。
答案 2 :(得分:0)
我有同样的问题,经过几次研究,我发现避免这个.Net错误的唯一解决方法是在列表不为空时仅将BindingList分配给DataSource。
如果它可以更改,您可以创建一个始终保留在列表中的虚拟对象,并在列表不为空时将其删除。
最后,它不值得找到一种方法来避免抛出ArgumentOutOfRangeException。