Laden...

Wie DataGridView aktualisieren bei DataSet

Erstellt von Thomas B vor 15 Jahren Letzter Beitrag vor 15 Jahren 2.749 Views
T
Thomas B Themenstarter:in
223 Beiträge seit 2006
vor 15 Jahren
Wie DataGridView aktualisieren bei DataSet

Hallo Community,

Ich versuche mich heute an DataSets und stelle eine Tabelle meines DataSets in einem DataGridView dar. Hinzufügen von Datensätzen über das DGV oder per Textfeldern ist kein Problem. Jedoch bekomme ich das DGV nicht aktualisiert, nachdem ich einen neuen Eintrag angelegt habe. Ich muss zuerst mein Programm neustarten, damit ich die neuen Datensätze sehen kann.

Versucht habe ich es mit den Methoden Refresh und Update des DGV.
Was mache ich falsch?

Gruß Thomas

R
158 Beiträge seit 2007
vor 15 Jahren

Guggst du hier, ähnliches 'Problem' und Lösung 😉

5.299 Beiträge seit 2008
vor 15 Jahren

Hmm, soweit ich mich erinnere, wird das DGV automatisch aktualisiert, wenn der DataTable eine neue Datarow zugefügt wird.
Ausnahme ist, wie raiguen erwähnt, wenn das DGV auf einer derzeit nicht aktiven TabPage ist.

Hastemal Code?

Der frühe Apfel fängt den Wurm.

T
Thomas B Themenstarter:in
223 Beiträge seit 2006
vor 15 Jahren

Hallo,

Ich habe die Lösung für mein Problem gefunden. Folgende Zeile löst das Problem:


this.categoriesTableAdapter.Fill(this.northwindDataSet.Categories);

// hier der Zusammenhang
if (this.textBox1.Text.Length > 0 && this.textBox2.Text.Length > 0)
            {
                this.categoriesTableAdapter.Insert(this.textBox1.Text, this.textBox2.Text, null);
                this.categoriesTableAdapter.Fill(this.northwindDataSet.Categories);
            }

Durch diese eine Zeile wird das DGV aktualisiert. Dies wird nur dann benötigt, wenn die Daten nicht direkt über das DGV geändert werden, sondern über zusätzliche Textfelder.

Gruß Thomas

5.299 Beiträge seit 2008
vor 15 Jahren

Das heißt, um einen Datensatz hinzuzufügen schreibst du ihn erst in die Datenbank, löschst dann die ganze DataTable, und befüllst sie neu aus der Datenbank.

Sagnwamalso: Das bringt nicht ganz die Performance, die ADO.Net eigentlich zu bringen imstande ist. 😉

Wie isses mit

if (this.textBox1.Text.Length > 0 && this.textBox2.Text.Length > 0) {
   this.northwindDataSet.Categories.AddCategoriesRow(textBox1.Text, textBox2.Text);
}

?

Der frühe Apfel fängt den Wurm.

T
Thomas B Themenstarter:in
223 Beiträge seit 2006
vor 15 Jahren

Hi,

Das funktioniert schon sehr gut, aber was mache ich nun, wenn ich nicht über den Designer die Datenbankanbindung erstellt habe?


string[] NewRow = new string[4];
NewRow[0] = txtName.Text;
NewRow[1] = txtCountryCode.Text;
NewRow[2] = txtDistrict.Text;
NewRow[3] = txtPopulation.Text;
this.mDataSet.Tables["Cities"].Rows.Add(NewRow);

Hier meckert er natürlich, dass mein String nicht in int32 für die id (auto increment) umgewandelt werden kann.

Gruß Thomas

J
3.331 Beiträge seit 2006
vor 15 Jahren

Sagnwamalso: Du suchst Dir von den vielen Möglichkeiten, die ADO.NET bietet, zielgerichtet eine möglichst unpassende aus.

Wenn Du in :rtfm: das Beispiel unter DataRowCollection.Add-Methode mit einem Array als Parameter ansiehst, stellst Du fest, dass es ein Object-Array ist. Das entspricht der Tatsache, dass es sich nicht immer um string handelt. Das Objekt am Index 0 gehört in Spalte 0, Index 1 zu Spalte 1 usw. - und das führt zu Deinem Fehler.

Wenn die autoinc-Spalte auch in der DataTable registriert ist, geht es mit der anderen Add-Variante so:

DataRow row = mDataSet.Tables["Cities"].NewRow();
row.BeginEdit();
row["Name"] = txtName.Text; // suw.
row.EndEdit();
mDataSet.Tables["Cities"].Rows.Add(row);

Gruß Jürgen

84 Beiträge seit 2007
vor 15 Jahren

Dein grundsätzlicher Ansatz erscheint mir etwas unsauber.

Prinzipiell solltest du so vorgehen:

  1. Mit der TableAdapter.Fill()-Methode Daten in die Tabellen des DataSet laden
  2. Die Daten dort bearbeiten, Zeilen hinzufügen, löschen
  3. Mit der Update()-Methode des TableAdapters diese Änderungen zurück in die DB schreiben.

Wenn das DGV die Änderungen am DataSet nicht gleich anzeigt:
DGV nach einer Änderung neu binden mit DGV.DataSource = myDataSet.myTable

Am besten verwendest du aber gleich eine BindingSource:

DataSet -> BindingSource -> DataGridView :

myBindingSource.DataSource = myDataSet.myTable;
myDataGridView.DataSource = myBindignSource;

Dann werden Änderungen sofort angezeigt.

84 Beiträge seit 2007
vor 15 Jahren

Autoincrement-Spalten sind so eine Sache.
Idr. ist es oft am besten wenn du eine eben gespeicherte Zeile neu einliest, damit du die durch die DB vergebenen ID erfährst.
Generierst du die IDs in der Software, könnte es u.a. Probleme bei mehreren Benutzern geben.

Gruß,
Razer

R
158 Beiträge seit 2007
vor 15 Jahren

...
Wenn das DGV die Änderungen am DataSet nicht gleich anzeigt:
DGV nach einer Änderung neu binden mit DGV.DataSource = myDataSet.myTable...

Habe die Feststellung gemacht, dass das nicht immer einwandfrei funktioniert 🙁

...
Am besten verwendest du aber gleich eine BindingSource:
... räusper genau DAS habe ich ja schon gesagt und in meinem verlinkten Posting (sh. dort meinen 2.Beitrag) beispielhaft ausgeführt... 😉

5.299 Beiträge seit 2008
vor 15 Jahren

@Razer

Wenn das DGV die Änderungen am DataSet nicht gleich anzeigt:
DGV nach einer Änderung neu binden mit DGV.DataSource = myDataSet.myTable

Ich denke, dann ist iwas faul, was man i.O. bringen muß.
Mindestens klären, warum, und ob das nicht Seiteneffekte haben kann.

Idr. ist es oft am besten wenn du eine eben gespeicherte Zeile neu einliest, damit du die durch die DB vergebenen ID erfährst.
Generierst du die IDs in der Software, könnte es u.a. Probleme bei mehreren Benutzern geben.

Da scheiden sich die Geister. Das eine Lager sagt "serverseitige Primkey-Generierung!", das andere "clientseitig!".
Ich gehöre ins Lager der clientseitigen, weilich das einfacher zu implementieren finde, und ist auch bischen schneller, weil nicht für jedes INSERT ein SELECT zurück-transportiert werden muß.
Bei Multi-User kann man Guid als Datentyp nehmen, der ist praktisch universell eindeutig.

Tatsächlich habich überhaupt ein Verständnisproblem, wie das mit der serverseitigen Primkey-Generierung gehen soll:
Habe ich 2 Tabellen im Dataset, Kategorie und Artikel.
Füge ich eine neue Kategorie hinzu, und füge der neuen Kategorie 2 Artikel hinzu.
Alles erstmal ohne zu speichern, getreu dem (auch von dir dargestellten) ADO-Konzept "1. Laden 2. Verarbeiten 3.Rückspeichern".
Wie kann ich die beiden neuen Artikel mit der Kategorie verknüpfen, wenn die noch gar keinen Primkey hat?

Der frühe Apfel fängt den Wurm.