4

我正在尝试在 C# WinFormsBindingList中将 aDataSource用作 a 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在 a 上使用空ListBox,以便向其中添加项目不会引发异常?

编辑:堆栈跟踪:

System.Windows.Forms.dll!System.Windows.Forms.ListBox.SelectedIndex.set(int value) + 0x1ec bytes
System.Windows.Forms.dll!System.Windows.Forms.ListControl.DataManager_PositionChanged(object 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(object sender, 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 字节
System.dll !System.ComponentModel.BindingList.InsertItem(int index, System._Canon item) + 0x3f bytes
mscorlib.dll!System.Collections.ObjectModel.Collection.Add(
System._Canon item) + 0x76 bytes

4

3 回答 3

2

事实证明,我在“异常”对话框(调试->异常)中检查了所有内容。因此,异常存在,但由 .Net 框架(默默地)处理。继续执行程序会显示预期结果。

于 2010-12-20T21:11:42.100 回答
0

您是否可能有一个事件处理程序附加到您的某个ListBox可能导致此问题的事件上?我无法重现您所描述的行为。

我创建了一个完全空白的 WinForms 项目,单个ListBox绑定到 a BindingList<string>,将值“Test”添加到列表中(在设置ListBox.DataSource属性之后),并且项目“Test”出现在框中,如预期的那样。

我会看看你ListBox的和你的BindingList<string>,看看是否有一些附加的事件处理程序你可能会丢失。

于 2010-12-20T19:07:09.243 回答
0

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

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

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

于 2014-11-05T16:50:04.970 回答