DataGridView und automatisch generiertes Update Kommando

30/05/2008 - 20:10 von Armin Schaefer | Report spam
Hall0 Leute,

ich bràuchte da mal wieder ein wenig Hilfe... Erstmal kurz zu meinem
System: Visual Studio 2005 mit ner Access 2003 Datenbank im Hintergrund.

Ich lade mir ne Tabelle der aus einer Datenbank in ein DataSet und zeige
sie dann über den Umweg eines DataViews in einem DataGridView an. Die
Tabelle hat einen Primàrschlüssel und bei der Gelegenheit lasse ich mir
auch direkt mit dem CommandBuilder Objekt die Update, Insert und Delete
Kommandos erzeugen. Hier der entsprechende Code dafür:

// Kunden aus Datenbank holen
OleDbCommand cmd = cn.CreateCommand();
cmd.CommandText = "SELECT * FROM Kunden;";

// Data Adapter das select Command zuweisen
da.SelectCommand = cmd;

// Command Builder erzeugen
cbldr = new OleDbCommandBuilder(da);

// DataSet fuellen
da.Fill(ds, "Kunden");

// Erzeuge Standard DataView
dvKunden = ds.Tables["Kunden"].Copy().DefaultView;
dKunden.AutoGenerateColumns = false;

// DataGrid an DataView binden
dKunden.DataSource = dvKunden;

Dkunden ist ein DataGridView, dvKunden ein DataView.

Klappt auch alles, aber jetzt möchte ich den Benutzer nicht im
DataGridView den Kram editieren lassen, sondern er soll einen Kunden
auswàhlen und dann auf den Editieren, bzw. Hinzufügen Knopf klicken. Ein
weiteres Fenster öffnet sich und der Benutzer kann die Kundendaten
komfortabel editieren. Die Übergabefunktion der Daten in das neue
Fenster sieht wie folgt aus:

// Durchlaufe das DataGrid um eine selektierte Zeile zu finden
foreach (DataGridViewRow Zeile in dKunden.SelectedRows)
{
// Selektierte Zeile gefunden
Kundenfenster myKundenfenster = new Kundenfenster(mainWin,
"editieren", (Zeile.DataBoundItem as DataRowView).Row);
myKundenfenster.Show();
}

Die Daten werden im Kundenfenster dann angezeigt und sollen dort mittels
Speichern in die Datenbank zurückgeschrieben werden. Dazu öffne ich die
Datenbank Connection, rufe die DataAdapter Update Routine auf und beende
das Ganze mit Acceptchanges und dem Schliessen der Datenbank:

mainwindow.cn.Open();

// Aenderungen in die Datenbank schreiben
mainwindow.da.Update(mainwindow.ds,"Kunden");
mainwindow.ds.Tables["Kunden"].AcceptChanges();

mainwindow.cn.Close();

Resultat des Ganzen:

Im DataGridView im Hauptfenster werden die Änderungen sofort sichtbar,
in der Access Datenbank sind hingegen keine Änderungen verzeichnet.

Wenn ich vor dem Update der Datenbank mittels der HasChanges() Routine
Überprüfe, ob Änderungen anstehen, wird mir immer ein FALSE
zurückgeliefert, es gibt also nichts zu aktualisieren. Warum?


Zweiter Fall ist die Neuanlage eines Kunden... Ich erzeuge eine neue
DataRow und rufe mein Editierfenster mit dem Kommando "hinzufuegen" auf:

// neuen Kunden hinzufuegen
DataRow Zeile;
Zeile = ds.Tables["Kunden"].NewRow();
Kundenfenster myKundenfenster = new Kundenfenster(mainWin,
"hinzufuegen", Zeile);
myKundenfenster.Show();

Die Kundendaten können eingegeben werden und die obige gleiche
Speicherroutine kümmert sich um den Eintrag in die Datenbank. Eine
HasChanges() Abfrage gibt diesmal den Wert TRUE zurück und der Eintrag
landet auch in der Datenbank. Allerdings taucht der neu eingegebene
Kunde im DataGridView erst nach einem Neustart des Programms auf. Auch
hier wieder: Warum?

Ich habe da irgendwie ein Brett vorm Kopf und komme bei beiden Problemen
nicht wirklich weiter.

Ciao, Armin
 

Lesen sie die antworten

#1 Frank Dzaebel
30/05/2008 - 20:30 | Warnen spam
Hallo Armin,

dvKunden = ds.Tables["Kunden"].Copy().DefaultView;



wozu brauchst Du da jene ungewöhnlich Konstruktion.
Du verlierst doch den Bezug zu Deiner Tabelle und
ein Update wird nur sehr schwer automatisch möglich sein.


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen