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在设置之后以任何一种方式拥有所有正确的数据...它只是在复制数据时,它实际显示,而当它不复制时,它不会显示.
((CurrencyManager)_listBox.BindingContext[_listBox.DataSource]).Refresh();
Run Code Online (Sandbox Code Playgroud)
Sux0r我知道,但这很有效.(最初在这里找到答案)
我突然想到,这是因为该ListBox.DataSource属性必须包含实现该IList接口的内容。你的泛型List<SubObject>没有实现IList;它实现IList<T>(在System.Collections.Generic命名空间中)。Array另一方面,对象确实继承自IList,因此通过此类对象传递数据是可行的。
您可以尝试从对象中取出一个Enumerator(也实现)并将其插入。如果它有效,那么我描述的问题就是您的问题。如果没有,那么我就是在胡言乱语。IListList<SubObject>
如果这确实是问题所在,那么我很惊讶推入不受支持的对象不会引发异常。