Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Wie DataGridView aktualisieren bei DataSet
Thomas B
myCSharp.de - Member



Dabei seit:
Beiträge: 226

Themenstarter:

Wie DataGridView aktualisieren bei DataSet

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
raiguen
myCSharp.de - Member



Dabei seit:
Beiträge: 158
Herkunft: 31020 Salzhemmendorf

beantworten | zitieren | melden

Guggst du hier, ähnliches 'Problem' und Lösung
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5409

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Thomas B
myCSharp.de - Member



Dabei seit:
Beiträge: 226

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5409

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Thomas B
myCSharp.de - Member



Dabei seit:
Beiträge: 226

Themenstarter:

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Thomas B am .
private Nachricht | Beiträge des Benutzers
juetho
myCSharp.de - Member



Dabei seit:
Beiträge: 3358
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Razer
myCSharp.de - Member

Avatar #avatar-2389.jpg


Dabei seit:
Beiträge: 84
Herkunft: BW/DE

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Razer
myCSharp.de - Member

Avatar #avatar-2389.jpg


Dabei seit:
Beiträge: 84
Herkunft: BW/DE

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
raiguen
myCSharp.de - Member



Dabei seit:
Beiträge: 158
Herkunft: 31020 Salzhemmendorf

beantworten | zitieren | melden

Zitat von Razer
...
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
Zitat von Razer
...
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...
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5409

beantworten | zitieren | melden

@Razer
Zitat
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.
Zitat
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.
private Nachricht | Beiträge des Benutzers