Bindungsliste an DataGridView in WinForm

ich habe ein klasse

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

und eine List zu der ich einige Elemente hinzufüge. Die Liste ist an meine DataGridView gebunden.

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

Es gibt kein Problem. myGrid zeigt zwei Zeilen an, aber wenn ich neue Einträge zu meiner persons hinzufüge, zeigt myGrid keine neue aktualisierte Liste an. Es zeigt nur die zwei Zeilen, die ich zuvor hinzugefügt habe.

Also, wo liegt das Problem?

Das erneute Binden funktioniert jedes Mal gut. Aber wenn ich eine DataTable an das Raster binde, wenn ich jedes Mal, wenn ich einige Änderungen an DataTable mache, keine Notwendigkeit habe, myGrid neu zu myGrid .

Wie man es triggers, ohne jedes Mal neu zu binden?

List implementiert keine IBindingList damit das Grid nicht über Ihre neuen Elemente informiert wird.

Binden Sie stattdessen Ihr DataGridView an eine BindingList .

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

Aber ich würde sogar noch weiter gehen und dein Gitter an eine BindingSource binden

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

Jedes Mal, wenn Sie der Liste ein neues Element hinzufügen, müssen Sie Ihr Gitter erneut binden. Etwas wie:

 List persons = new List(); 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; 

Nach dem Hinzufügen eines neuen Objekts zu persons hinzufügen:

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

Ja, es ist möglich, das erneute Binden durch Implementieren der INotifyPropertyChanged-Schnittstelle zu vermeiden.

Ziemlich einfaches Beispiel ist hier verfügbar,

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