ListBox.DataSource的奇怪问题

9 forms datasource listbox c#-3.0

我正在编写Windows应用程序并使用Listbox控件.我正在使用Visual Studio C#2008 Express Edition进行开发.

我有一个看起来像这样的数据对象

public class RootObject
{
   public List<SubObject> MySubObjects{ get; set;}
}
Run Code Online (Sandbox Code Playgroud)

我的表单上有一个ListBox,还有一个属性"MyRootObject",显然它拥有一个RootObject.初始化控件时,我设置:

_listBox.DataSource = MyRootObject.MySubObjects;
Run Code Online (Sandbox Code Playgroud)

现在,当表单加载时,我调试并看到正确设置了DataSource.但没有显示任何内容.我已经覆盖了SubObject的ToString()方法,甚至没有被调用.我尝试将_listBox.DisplayMember设置为SubObject的属性,只是为了查看是否存在某些问题,但仍然没有.我在设置DataSource后尝试调用_listBox.Update()和_listBox.Refresh(),但仍然没有爱.DataSource拥有所有数据......它只是拒绝显示它.

所以在调试时,我想知道WTF,我决定这样做

_listBox.DataSource = new List<SubObject>{ new SubObject(), new SubObject() };
Run Code Online (Sandbox Code Playgroud)

果然,这很有效,我看到列表框中列出了两件事.

那么,真的很好奇,我决定尝试复制对象列表并将其放入列表框中,如下所示:

_listBox.DataSource = MyRootObject.MySubObjects.ToArray();
Run Code Online (Sandbox Code Playgroud)

这有效!现在这是解决我的问题的方法......但是非常讨厌.有谁知道为什么我需要基本上复制像这样的对象列表才能使它工作,而不是只设置_listBox.DataSource = MyRootObject.MySubObjects; ?同样,DataSource在设置之后以任何一种方式拥有所有正确的数据...它只是在复制数据时,它实际显示,而当它不复制时,它不会显示.

Nat*_*Nat 5

((CurrencyManager)_listBox.BindingContext[_listBox.DataSource]).Refresh();
Run Code Online (Sandbox Code Playgroud)

Sux0r我知道,但这很有效.(最初在这里找到答案)


Dus*_*man 1

我突然想到,这是因为该ListBox.DataSource属性必须包含实现该IList接口的内容。你的泛型List<SubObject>没有实现IList;它实现IList<T>(在System.Collections.Generic命名空间中)。Array另一方面,对象确实继承自IList,因此通过此类对象传递数据是可行的。

您可以尝试从对象中取出一个Enumerator(也实现)并将其插入。如果它有效,那么我描述的问题就是您的问题。如果没有,那么我就是在胡言乱语。IListList<SubObject>

如果这确实是问题所在,那么我很惊讶推入不受支持的对象不会引发异常。