添加到DataSource时ListBox抛出ArgumentOutOfRangeException

时间:2010-12-20 18:44:36

标签: c# listbox datasource bindinglist

我正在尝试使用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

3 个答案:

答案 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。