将 DataGridView 绑定到 List<T> 不显示数据
Posted
技术标签:
【中文标题】将 DataGridView 绑定到 List<T> 不显示数据【英文标题】:Binded DataGridView to List<T> not showing data 【发布时间】:2012-12-11 02:02:42 【问题描述】:这是我的代码(这是一个非常简单的例子):
public partial class Form1 : Form
List<Person> listPersons;
public Form1()
InitializeComponent();
listPersons = new List<Person>();
dataGridView1.DataSource = listPersons;
private void button1_Click(object sender, EventArgs e)
if (textBox1.Text.Length > 0)
Person p = new Person();
p.Name = textBox1.Text;
listPersons.Add(p);
class Person
public string Name get; set;
当您按下按钮时,数据会添加到列表中,但不会显示在 DataGridView
中。我错过了什么?
我尝试将AutoGenerateColumns
和VirtualMode
设置为true
,但这也没有解决问题。
【问题讨论】:
【参考方案1】:已经有一段时间了,自从处理尝试将 List
无论如何,我使用的是BindingListView,它非常快速和简单。你只需这样做:
List<Customer> customers = GetCustomers();
BindingListView<Customer> view = new BindingListView<Customer>(customers);
dataGridView1.DataSource = view;
你就完成了。几年没看源码了,但我相信它用一个实现 IBindingList 的类包装了 List
【讨论】:
+1 DataGridView 的文档说实现 IList 的 DataSource 可以工作,但首选 IBindingSource,因为它会自动处理很多绑定问题,大概是这样的。 @jam40jeff:是的,我必须查一下。如果您想以任何方式对列表进行排序,IBindingList 似乎是一项要求。 抱歉,在 VS 2008 及更早版本中没有 BindingListView 类。将尝试对 BindingList 类做同样的事情 - 让你知道 不,使用 BindingList但如果我只使用BindingList<T>
而不是List<T>
它确实有效。
示例代码:
BindingList<Person> bl;
public Form1()
InitializeComponent();
bl = new BindingList<Person>();
dataGridView1.DataSource = bl;
private void button1_Click(object sender, EventArgs e)
if (textBox1.Text.Length > 0)
Person p = new Person();
p.Name = textBox1.Text;
bl.Add(p);
textBox1.Text = "";
textBox1.Focus();
但我仍然想弄清楚如何在 DataGridView
与 List 绑定后显示数据。
【讨论】:
【参考方案3】:集中您的 FillGrid
功能并在您想要更新网格时调用它
public Form1()
InitializeComponent();
listPersons = new List<Person>();
FillGrid();
private void button1_Click(object sender, EventArgs e)
if (textBox1.Text.Length > 0)
Person p = new Person();
p.Name = textBox1.Text;
listPersons.Add(p);
FillGrid();
private void FillGrid()
dataGridView1.DataSource = listPersons;
【讨论】:
所以每次我都会设置DataSource?不,这也不起作用。【参考方案4】:使用数组绑定datagridview ie
public partial class Form1 : Form
Person[] listPersons = new Person[0];
public Form1()
InitializeComponent();
dataGridView1.DataSource = listPersons;
private void button1_Click(object sender, EventArgs e)
if (textBox1.Text.Length > 0)
Person p = new Person();
p.Name = textBox1.Text;
Array.Resize<Person>(ref listPersons, listPersons.Length+1);
listPersons[listPersons.Length-1]=p;
dataGridView1.DataSource = listPersons;
class Person
public string Name get; set;
【讨论】:
【参考方案5】:我认为您不能直接将列表绑定到 datagridview。 而是使用 BindingList。
public partial class Form1 : Form
BindingList<Person> lstBinding;
public Form1()
InitializeComponent();
lstBinding = new BindingList<Person>();
dataGridView1.DataSource = lstBinding;
private void button1_Click(object sender, EventArgs e)
if (textBox1.Text.Length > 0)
Person p = new Person();
p.Name = textBox1.Text;
lstBinding.Add(p);
FillGrid();
private void FillGrid()
dataGridView1.DataSource = lstBinding;
class Person
private string name;
public string Name
get return name;
set name = value;
【讨论】:
【参考方案6】:添加到列表后尝试调用dataGridView1.Refresh();
。
【讨论】:
以上是关于将 DataGridView 绑定到 List<T> 不显示数据的主要内容,如果未能解决你的问题,请参考以下文章
winForms + DataGridView 绑定到 List<T>
在 WinForm 中将 List<T> 绑定到 DataGridView
如何使用 DataGridViewAutoFilter 库将 List<DisplayedInfo> 绑定到 datagridview?