ich habe ein klasse
class Person{
public string Name {get; set;}
public string Surname {get; set;}
}
und a, List<Person>
zu dem ich einige Elemente hinzufüge. Die Liste ist an meine gebunden 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;
Es gibt kein Problem. myGrid
Zeigt zwei Zeilen an, aber wenn ich meiner persons
Liste neue Elemente hinzufüge , myGrid
wird keine neue aktualisierte Liste angezeigt . Es werden nur die beiden Zeilen angezeigt, die ich zuvor hinzugefügt habe.
Was ist also das Problem?
Jedes Mal neu binden funktioniert gut. Aber wenn ich ein DataTable
an das Raster binde , wenn jedes Mal, wenn ich Änderungen daran vornehme, DataTable
keine erneute Bindung erforderlich ist myGrid
.
Wie kann man es lösen, ohne jedes Mal neu zu binden?
One
Sie können eine BindingList verwenden, die ein Ereignis auslöst, wenn sich die zugrunde liegende Liste ändert. Eine andere Möglichkeit besteht darin,BindingSource
jedes Mal, wenn Sie eine Zeile hinzufügen / löschen, a und ResetBinding () aufzurufen, aber das ist viel mehr Arbeit. Wenn Sie das Grid über Eigenschaftsänderungen informieren möchten, ist die Implementierung am einfachstenINotifyPropertyChanged
List<T>
wenn Sie möchten. Wenn Sie jedoch programmgesteuert Elemente zur Liste hinzufügen, weiß DataGridView nichts davon, da Ihre Liste nicht implizit istIBindingList
. In Bezug auf BindingSource: Ich verwende häufig Winforms und binde an nichts anderes als an eine BindingSource - FULLSTOP. Weitere Details hinzuzufügen ist zu viel für einen Kommentar, hat aberBindingSource
ohne Nachteile so viel zu bieten. Ich würde so weit gehen und sagenAnyone who does not use a BindingSource for binding has not fully understood windows forms databindings
BindingSource
als Brücke zwischen Ihrer Datenquelle und Ihrer GUI. Es löst viele Probleme im Zusammenhang mit der Datenbindung. Sie möchten Ihre Daten neu laden?bindingSource.DataSource
Stellen Sie einfach Ihre neue Sammlung ein, anstatt jedes Steuerelement neu zu binden. Ihre DataSource kann null sein? SetbindingSource.DataSource = typeof(YourClass)
Sie möchten ein bearbeitbares Raster haben, aber Ihre Datenquelle hat keinen parameterlosen Konstruktor? Implementieren Sie einfach dasbindingSource.AddingNew
Ereignis und erstellen Sie das Objekt selbst. Ich habe bei der Verwendung nie einen Nachteil erlebt,BindingSource
aber viele Vorteile.Jedes Mal, wenn Sie der Liste ein neues Element hinzufügen, müssen Sie Ihr Raster neu binden. Etwas wie:
quelle
Ja, durch die Implementierung der INotifyPropertyChanged-Schnittstelle ist ein erneutes Binden möglich.
Ein ziemlich einfaches Beispiel finden Sie hier.
http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx
quelle
INotifyPropertyChanged
Dies ist nicht ausreichend, wenn Sie DataGridView implementieren. Es werden alle Eigenschaftsänderungen angezeigt, die im Hintergrund auftreten. Es ist jedoch nicht bekannt, ob Sie eine Zeile zu Ihrer Quelle hinzufügen oder daraus löschen. Zu diesem Zweck gibt es eineIBindingList
Schnittstelle und zu Ihrer Überzeugung eine ImplementierungBindingList<T>
, die diese bereits implementiert, aber das Sortieren / Filtern nicht unterstützt.Nach dem Hinzufügen eines neuen Elements zum
persons
Hinzufügen:quelle
null
wenn Sie es sofort inpersons
der nächsten Zeile zuweisen ?Dies ist nicht genau das Problem, das ich hatte, aber wenn jemand eine Bindungsliste eines beliebigen Typs in eine Liste desselben Typs konvertieren möchte, wird dies folgendermaßen durchgeführt:
Wenn Sie einer DataGridView.DataSource Bindungslisten dynamischer Typen zuweisen, müssen Sie diese zuerst als IBindingList deklarieren, damit die oben genannten Funktionen funktionieren.
quelle