将List <t>绑定到WinForm中的DataGridView </t>

时间:2013-05-22 15:32:25

标签: c# list datagridview binding grid

我有一个班级

class Person{
      public string Name {get; set;}
      public string Surname {get; set;}
}

List<Person>我添加了一些项目。该列表绑定到我的DataGridView

List<Person> persons = new List<Person>();
persons.Add(new Person(){Name="Joe", Surname="Black"});
persons.Add(new Person(){Name="Misha", Surname="Kozlov"});
myGrid.DataSource = persons;

没有问题。 myGrid显示两行,但当我向persons列表中添加新项时,myGrid不会显示新的更新列表。它只显示我之前添加的两行。

那么问题是什么?

每次重新绑定都很有效。但是当我每次对DataTable进行一些更改时,我都会将DataTable绑定到网格中,因此不需要重新绑定myGrid

如何在不重新绑定的情况下解决它?

5 个答案:

答案 0 :(得分:154)

列表未实现IBindingList,因此网格不知道您的新项目。

将DataGridView绑定到BindingList<T>

var list = new BindingList<Person>(persons);
myGrid.DataSource = list;

但我会更进一步将您的网格绑定到BindingSource

var list = new List<Person>()
{
    new Person { Name = "Joe", },
    new Person { Name = "Misha", },
};
var bindingList = new BindingList<Person>(list);
var source = new BindingSource(bindingList, null);
grid.DataSource = source;

答案 1 :(得分:3)

每次向List添加新元素时,都需要重新绑定Grid。 类似的东西:

List<Person> persons = new List<Person>();
persons.Add(new Person() { Name = "Joe", Surname = "Black" });
persons.Add(new Person() { Name = "Misha", Surname = "Kozlov" });
dataGridView1.DataSource = persons;

// added a new item
persons.Add(new Person() { Name = "John", Surname = "Doe" });
// bind to the updated source
dataGridView1.DataSource = persons;

答案 2 :(得分:1)

将新项目添加到persons后添加:

myGrid.DataSource = null;
myGrid.DataSource = persons;

答案 3 :(得分:1)

是的,可以通过实现INotifyPropertyChanged接口来进行重新绑定。

这里有一个非常简单的例子,

http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

答案 4 :(得分:0)

这不完全是我遇到的问题,但是如果有人希望将任何类型的BindingList转换为相同类型的List,则可以这样做:

var list = bindingList.ToDynamicList();

此外,如果要将动态类型的BindingList分配给DataGridView.DataSource,请确保首先将其声明为IBindingList,以便上面的方法起作用。