绑定列表<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