绑定列表<T>到WinForm中的DataGridView

我有一堂课

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

如何解决它而无需每次重新绑定?

列表没有实现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; 

每当你添加一个新的元素到列表中,你需要重新绑定你的网格。 就像是:

 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; 

添加新项目后添加:

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

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

很简单的例子可以在这里find,

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