winForms + DataGridView 绑定到 List<T>
Posted
技术标签:
【中文标题】winForms + DataGridView 绑定到 List<T>【英文标题】:winForms + DataGridView binding to a List<T> 【发布时间】:2010-09-12 14:41:04 【问题描述】:我正在尝试将 List<T>
绑定到 DataGridView 控件,但我没有任何运气来创建自定义绑定。
我试过了:
gvProgramCode.DataBindings.Add(new Binding("Opcode",code,"Opcode"));
它抛出一个异常,表示该属性名称没有找到任何东西。
相关列的名称是“操作码”。 List<T>
中的属性名称为 Opcode。
回答编辑:问题是我的类中没有可绑定字段作为属性,只有公共字段......显然它不会反映字段,只是属性。
【问题讨论】:
哈哈,这正是我在我的 cmets 中添加的内容,很高兴你的问题得到了解决。 +1 我也遇到了同样的问题。吸蛋的男人!!! 你真是天赐之物。现在,我已经连续六个小时一直在努力解决这个问题。尝试了我能想到的一切,以及我能想到的谷歌。没有运气。终于找到了你的帖子,当然,我很着急,把它们设为字段,而不是属性。 【参考方案1】:您是否也将网格上的属性绑定到 Opcode?...如果您想直接绑定到 List,您只需 DataSource = list。数据绑定允许自定义绑定。您是否正在尝试做数据源以外的事情?
你得到一堆空行?自动生成的列有名称吗?您是否已验证数据在对象中(不仅仅是 string.empty)?
class MyObject
public string Something get; set;
public string Text get; set;
public string Other get; set;
public Form1()
InitializeComponent();
List<MyObject> myList = new List<MyObject>();
for (int i = 0; i < 200; i++)
string num = i.ToString();
myList.Add(new MyObject Something = "Something " + num , Text = "Some Row " + num , Other = "Other " + num );
dataGridView1.DataSource = myList;
这应该可以正常工作...
【讨论】:
是的。如果我只是做 DataSource = list,我会得到一堆空列。 所以您只想将网格绑定到自定义对象列表中的操作码属性? 如果我问的是演员阵容,那就做... Grid.DataSource = MyList.Select(o => o.Opcode); 类中有三个字符串,Opcode就是其中之一。此类是 List我无法真正告诉您要对包含的示例进行什么操作,但是如果您只想列出对象,则绑定到通用对象列表相当简单:
private BindingSource _gridSource;
private BindingSource GridSource
get
if (_gridSource == null)
_gridSource = new BindingSource();
return _gridSource;
private void Form1_Load(object sender, EventArgs e)
List<FluffyBunny> list = new List<FluffyBunny>();
list.Add(new FluffyBunny Color = "White", EarType = "Long", Name = "Stan" );
list.Add(new FluffyBunny Color = "Brown", EarType = "Medium", Name = "Mike" );
list.Add(new FluffyBunny Color = "Mottled", EarType = "Short", Name = "Torvald" );
GridSource.DataSource = list;
dataGridView1.Columns["EarType"].Visible = false; //Optionally hide a column
dataGridView1.DataSource = GridSource;
如果您只想显示列表类型的特定属性,您应该能够使不需要的列不可见。
从技术上讲,您实际上并不需要创建 BindingSource,但如果我有它,我发现在进行更新或更改时会容易得多。
希望这会有所帮助。
【讨论】:
直接绑定到 List有同样的问题......我显然有一个带有公共字段的结构。网格中没有任何内容。提供公共吸气剂,工作。
【讨论】:
【参考方案4】:我发现的另一个解决方案是使用 BindingList 集合。
private void Form1_Load(object sender, EventArgs e)
BindingList people= new BindingList
new Person Name="John",Age=23,
new Person Name="Lucy",Age=16
;
dataGridView1.DataSource= people;
对我来说很好用,
【讨论】:
使用BindingList<T>
让我在尝试绑定DataGridViews 时省了力气!谢谢。以上是关于winForms + DataGridView 绑定到 List<T>的主要内容,如果未能解决你的问题,请参考以下文章
用dataGridView将数据绑上去后,再修改其中的数据,sql语句测试正确,却改不了数据,为啥呢?