DataGridView zeigt geänderte, aber keine neuen Zeilen

04/07/2008 - 15:16 von Michaela Meier | Report spam
Hi

Ich habe eine Info-Klasse erstellt und lasse die Daten mit

List<Info> infoliste=new List<Info>();
dgv.DataSource=Infoliste;

in einem DataGridView anzeigen (readonly ohne alles)

Das klappt auch wunderbar. Mit

dgv.DataSource=Infoliste;
dgv.Refresh()

reagiert das Teil sogar auf Änderungen bereits in der Liste
befindlicher Daten. Prima.Prima.

Wenn ich jedoch weitere Items hinzufügen möchte, werde ich stur
ignoriert.
Obwohl die infoliste beliebig viele neue Zeilen enthàlt, wird
ausschließlich die Anzahl an Zeilen im DataGridView angezeigt, die
schon beim Start der Form eingefüllt wurden.

Wenn ich spaßeshalber das erste Item aus infoliste lösche
also: infoliste.RemoveAt(0);
dann rückt plötzlich eins der neuen - bis dahin unsichtbaren - Items
in die letzte Zeile auf.

Passend dazu knallt mir ein IndexOutOfRangeException um die Ohren,
wenn ich es wage mehr Items zu entfernen als sich ursprünglich in der
infoliste befanden.
Eben weil die Zeilenanzahl im Gridview immer noch z.B. 10 ist, aber
jetzt nur noch 9 items in der DataSource.

Natürlich kann ich die DataSource nach einem Remove/Add mit
dgv.DataSource = null;
dgv.DataSource=Infoliste;

neu laden, aber danach muß ich auch wieder die komplette
Spaltenformatierung durchführen.
Ist das genauso gedacht (falls ja, Bug oder Feature? ;-)) oder
übersehe ich da eine offensichtliche Eigenschaft/Methode/Einstellung?

Danke

Michaela
 

Lesen sie die antworten

#1 Elmar Boye
04/07/2008 - 16:27 | Warnen spam
Hallo Michaela,

Michaela Meier schrieb:
Ich habe eine Info-Klasse erstellt und lasse die Daten mit

List<Info> infoliste=new List<Info>();
dgv.DataSource=Infoliste;

in einem DataGridView anzeigen (readonly ohne alles)

Das klappt auch wunderbar. Mit

dgv.DataSource=Infoliste;
dgv.Refresh()

reagiert das Teil sogar auf Änderungen bereits in der Liste
befindlicher Daten. Prima.Prima.

Wenn ich jedoch weitere Items hinzufügen möchte, werde ich stur
ignoriert.



Damit das DataGridView Änderungen mitbekommt muß die zugrundeliegende
Liste das ListChanged Ereignis (Teil von IBindingList) unterstützen.

Eine List<T> tut das nicht.
Verwende anstatt dessen eine System.ComponentModel.BindingList<T>.
Damit entfàllt auch die Notwendigkeit für ein explizites Refresh.


Zusatz: Wenn das DataGridView Änderungen an den Eigenschaften der Info
Objekte mitbekommen soll, so sollte die Klasse INotifyPropertyChanged
implementieren.

Hintergrund dazu: <URL:http://msdn.microsoft.com/de-de/lib...b.aspx>
"Auf Datenbindung bezogene Schnittstellen"

Gruß Elmar

Ähnliche fragen