Entwickler-Ecke

WinForms - Anzeige DataGridView über DataSource aktualisieren


DonC - Do 18.12.08 23:39
Titel: Anzeige DataGridView über DataSource aktualisieren
Hi Leutz,

folgendes Problem: Ich habe zwei TabPages und in einer der TabPages wird ein DataGridView angezeigt. Das DataGridView hat als DataSource eine DataTable. Dieser DataTable werden zur Laufzeit meines Programms öfters Zeilen hinzugefügt, geändert und entfernt.
Ich habe nun das Problem, dass wenn der DataTable neue Zeilen hinzugefügt oder entfernt werden, die Anzeige der Zeilen im DataGridView nicht sofort aktualisiert wird. Erst wenn ich die andere (leere) TabPage anklicke und danach wieder die TabPage öffne, in der das DataGridView angezeigt wird, werden auch die aktuellen Daten der DataTable korrekt im DataGridView angezeigt. Mir scheint so, als ob das DataGridView nicht immer sofort neu gezeichnet wird. Gibt es eine Möglichkeit, die Anzeige des DataGridViews manuell zu refreshen, wenn eine Änderung in der DataSource erfolgt ist?

Gruß,
Chris


Nally - Fr 19.12.08 00:33
Titel: Re: Anzeige DataGridView über DataSource aktualisieren
user profile iconDonC hat folgendes geschrieben Zum zitierten Posting springen:
Hi Leutz,

folgendes Problem: Ich habe zwei TabPages und in einer der TabPages wird ein DataGridView angezeigt. Das DataGridView hat als DataSource eine DataTable. Dieser DataTable werden zur Laufzeit meines Programms öfters Zeilen hinzugefügt, geändert und entfernt.
Ich habe nun das Problem, dass wenn der DataTable neue Zeilen hinzugefügt oder entfernt werden, die Anzeige der Zeilen im DataGridView nicht sofort aktualisiert wird. Erst wenn ich die andere (leere) TabPage anklicke und danach wieder die TabPage öffne, in der das DataGridView angezeigt wird, werden auch die aktuellen Daten der DataTable korrekt im DataGridView angezeigt. Mir scheint so, als ob das DataGridView nicht immer sofort neu gezeichnet wird. Gibt es eine Möglichkeit, die Anzeige des DataGridViews manuell zu refreshen, wenn eine Änderung in der DataSource erfolgt ist?

Gruß,
Chris


setzt du deine DataTable mit einer DataView um?

http://msdn.microsoft.com/de-de/library/system.data.dataview(VS.80).aspx


raiguen - Fr 19.12.08 01:19
Titel: Re: Anzeige DataGridView über DataSource aktualisieren
Moin :)
Also, wenn eine DataTable DIRKET als DataSource an ein DataGridView angestöpselt ist, dann werden Änderungen in der DataTabele leider nicht ans DGV weitergereicht (ob das ein Bug ist oder ein Feature lass ich mal dahingestellt sein ;) ).
Wenn du allerdings zwischen der DataTable und dem DGV eine BindinghSource schaltest, dann werden Änderungen an der zugrundeliegenden Datenquelle (=DataTable) an das DGV weitergereicht...

Werden bei Dir mit dem Tabpage-Wechsle irgendwelche 'refresh'-Aktionen oder komplettes Neufüllen der DataTable durchgeführt, die die von dir erwähnten Aktualisierungen anzeigen?

Gruss Rainer


DonC - Fr 19.12.08 14:43

Hoi,
also beim Tab-Wechsel werden keinerlei Refresh-Aktionen durchgeführt. Ich habe jetzt einfach mal eine Binding-Source dazwischengeschaltet, aber nun passiert garnix mehr, d.h. jetzt werden im DGV überhaupt keine Daten mehr angezeigt. Ich habe die BindingSource folgendermaßen dazwischengeschaltet:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
DataGridView dgv1 = new DataGridView();
DataTable table1 = new DataTable();

//Hier kommt jetzt der Code, mit dem die DataTable gefüllt wird -> lasse ich jetzt hier mal raus

BindingSource s1 = new BindungSource();
s1.DataSource = table1;

dgv1.DataSource = s1;


Wie gesagt, jetzt wird im DGV garnix mehr angezeigt. Mache ich irgendwas falsch?

Greetings,
Chris


raiguen - Fr 19.12.08 19:52

Moin :)

okay, das Ganze ist in der Tat etwas ungewöhnlich kompliziert (um nicht zu sagen: unlogisch...), aber wenn eine BindingSource verwendet wird, dann MUSS alles über diese 'gesteuert' werden:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
DataGridView dgv1 = new DataGridView();
DataTable table1 = new DataTable();

BindingSource bindingSource1 = new BindungSource();
bindingSource1.DataSource = table1;

dgv1.DataSource = bindingSource1;

//neuen datensatz anfügen
bindingSource1.AddNew();    
//--Datenzeile erzeugen, in die etwas eingetragen wird
DataRowView row = (DataRowView)bindingSource1.Current;

//--hier Werte für die neue Datenzeile einfügen
row["..."] = "blabla";
row["..."] = "blubb";

//--Zeile speichern und im DGV sichtbar machen
bindingSource1.EndEdit();


DonC - Sa 20.12.08 00:11

Hi,

besten Dankf für das obige Beispiel :-)
Aber eine Frage habe ich noch: Wie mache ich es, wenn ich eine bereits existierende Zeile updaten möchte? Daher, wie kann ich die bereits existierenden Zeilen in der BindingSource durchlaufen und deren Werte ändern?


JüTho - Sa 20.12.08 12:22

Hallo,

wie Du von einem Element der BindingSource zu einer Datenzeile kommst, hat Dir raiguen schon gezeigt. Das kannst Du auf Current oder auf alle Elemente anwenden:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
foreach(object item in bindingSource1.Items) {
   //  Datenzeile benutzen, in der etwas geändert wird
   DataRowView row = (DataRowView)item;
   row.BeginEdit();

   //  hier Werte für die Datenzeile ändern
   row["..."] = "blabla";
   row["..."] = "blubb";

   //  Zeile speichern und im DGV sichtbar machen
   row.EndEdit();
   //   ausprobieren, ob das auch jetzt noch nötig ist:
   bindingSource1.EndEdit();
}

Gruß Jürgen