Autor Beitrag
DonC
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Do 18.12.08 23:39 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 46



BeitragVerfasst: Fr 19.12.08 00:33 
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?

msdn.microsoft.com/d...dataview(VS.80).aspx
raiguen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 374

WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
BeitragVerfasst: Fr 19.12.08 01:19 
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 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 374

WIN 2000prof, WIN XP prof
D7EP, MSSQL, ABSDB
BeitragVerfasst: 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:

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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:
ausblenden 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