Autor Beitrag
KostaK
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: Do 18.02.10 17:45 
Hallo Leute,

hab schon wieder ein Problem seit Heute Morgen und jetzt schreibe ich.

es get drum eine DataGridView mit einem adapter zu speichern.

code:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
private void WriteInDBTableFromDGV(DataGridView dgv, string tabelle)
        {
            OleDbDataAdapter objAdapter = new OleDbDataAdapter("Select * from " + tabelle, objCon);
            OleDbCommandBuilder objCB = new OleDbCommandBuilder(objAdapter);

            DataTable dta = new DataTable();
            dta = (DataTable)dgv.DataSource;
            objAdapter.Update(dta);  
        }

bis jetzt alles ok und nun der Fehler:

ich gebe eine Wert in ein Feld der View und er kommt nicht zur DB Tabelle an, wenn ich mit dem debugger auf das DataTable gehe ist der Wert drin das Update wird ohne fehler gemacht.

....Table.GetChanges() -> bringt auch nichts keine änderung obwohl die Anderung im DataTable zu sehen ist.

Ich bin verzweifelt -> danke im voraus. mfg Kosta

muß noch dazu sagen wenn ich ein paar mal in den Zeilen der Grid hin und her springe dann wird gespeichert Hmm..
Soll aber nicht so sein.







Moderiert von user profile iconKha: C#-Tags hinzugefügt
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: Do 18.02.10 20:19 
user profile iconKostaK hat folgendes geschrieben Zum zitierten Posting springen:
muß noch dazu sagen wenn ich ein paar mal in den Zeilen der Grid hin und her springe dann wird gespeichert Hmm..

Das war der entscheidende Hinweis. Füge vor das Update noch ein DataGridView.EndEdit ein: das überträgt die aktuellen Daten in die DataTable, genauso wie es sonst durch das Wechseln des Datensatzes passiert.

Übrigens ist dein Zugriff auf die DataTable etwas seltsam:
ausblenden C#-Quelltext
1:
2:
1. DataTable dta = new DataTable();
2. dta = (DataTable)dgv.DataSource;

In Zeile 1 wird eine neue DataTable erzeugt, mit der wird aber nichts - gar nichts - gemacht.
In Zeile 2 wird dieser Variablen die DataSource als DataTable zugewiesen.

Ist die DataTable denn nicht sowieso im Formular bekannt? Dann kannst du sie direkt für das Update verwenden.

Gruß Jürgen
KostaK Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: Do 18.02.10 20:35 
Hi Jürgen,

danke für die Antwort.

Wie meinst du das nichts gemacht wird -> ich hab mir ein paar beispiele angeschaut und die machen es alle so (denke ich).

ich weise der DataTable die Grid zu: dta = (DataTable)dgv.DataSource;

und dann tut der adapter das Update mit der DB: objAdapter.Update(dta); mit den Daten der DataTable aus der Grid -> Hmm...

ist das falsch?

ich mein es funktioniert ja so larifarimäßig.

bzw. wie ist es richtig ?

noch was EndEdit() geht leider nicht.

ohne DataTable geht es auch

dgv.EndEdit();
objAdapter.Update((DataTable)dgv.DataSource);

Gruß Kosta
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: Do 18.02.10 21:31 
Es wäre schön, wenn du künftig deine Gedanken etwas mehr sortieren könntest und nicht alle Gesichtspunkte so hintereinanderweg schreiben würdest, wie sie dir in den Kopf kommen. Dieses Durcheinander macht es mir ziemlich schwer, sinnvoll zu antworten.

user profile iconKostaK hat folgendes geschrieben Zum zitierten Posting springen:
Wie meinst du das nichts gemacht wird

In Zeile 1 wird der Variablen dta eine neu erzeugte DataTable zugewiesen. Diese DataTable ist leer, hat keine Columns und keine Rows. Sie steht vielleicht im Arbeitsspeicher an der Stelle 4F 3C 77 00. Danach:
user profile iconKostaK hat folgendes geschrieben Zum zitierten Posting springen:
ich weise der DataTable die Grid zu: dta = (DataTable)dgv.DataSource;

In Zeile 2 holst du aus der DataSource eine völlig andere DataTable, nämlich eine mit Columns und Rows, die im Arbeitsspeicher vielleicht an der Stelle 76 54 32 10 steht, und willst diese künftig mit dem Namen dta ansprechen.

Was glaubst du wohl, was mit der DataTable an Position 4F 3C 77 00 passiert und gemacht wird?
JüTho hat folgendes geschrieben:
mit der wird aber nichts - gar nichts - gemacht.

Weiter:
user profile iconKostaK hat folgendes geschrieben Zum zitierten Posting springen:
-> ich hab mir ein paar beispiele angeschaut und die machen es alle so (denke ich).

Das kann ich mir gar nicht vorstellen. Vielleicht steht es in den Beispielen so:
ausblenden C#-Quelltext
1:
2:
DataTable dta;
dta = (DataTable)dgv.DataSource;

Erkennst du den entscheidenden Unterschied? Ist dir klar, was dieser Unterschied zu bedeuten hat?

user profile iconKostaK hat folgendes geschrieben Zum zitierten Posting springen:
und dann tut der adapter das Update mit der DB: objAdapter.Update(dta); mit den Daten der DataTable aus der Grid -> Hmm...
ist das falsch?

Nein, es ist nicht unbedingt falsch. Aber wenn beim Einlesen eine feste DataTable verwendet wird (nämlich eine, die in der Anwendung direkt drin steht und einen dauerhaft gültigen Namen hat), hat man einen besseren Überblick über die vorhandenen Objekte.

user profile iconKostaK hat folgendes geschrieben Zum zitierten Posting springen:
ich mein es funktioniert ja so larifarimäßig.

bzw. wie ist es richtig ?

Wie ich schon sagte: Irgendwo in der Anwendung dta (meistens auch mit DataSet) deklarieren, beim DbDataAdapter.Fill mit Inhalt versehen und überall dort, wo diese DataTable verwendet wird, auch diese Instanz und damit auch diese Variable benutzen.

user profile iconKostaK hat folgendes geschrieben Zum zitierten Posting springen:
noch was EndEdit() geht leider nicht.

Den entscheidenden Punkt versteckst du mittendrin. Das geht nicht? Das kann ich gar nicht glauben.

user profile iconKostaK hat folgendes geschrieben Zum zitierten Posting springen:
ohne DataTable geht es auch
ausblenden C#-Quelltext
1:
2:
            dgv.EndEdit();
            objAdapter.Update((DataTable)dgv.DataSource);

Natürlich. Du machst dabei nichts anderes; du verzichtest nur auf einen nutzlosen new-Befehl und eine insofern überflüssige Variable.

Noch etwas: Die Überschrift ist eigentlich falsch. Es geht darum, dass die DataTable etwas speichern soll, nicht das DataGridView. Du musst zwischen Anzeige-Objekt und Daten-Objekt unterscheiden. Allerdings kann ich deine Formulierung verstehen; denn die Tatsache, dass nicht gespeichert wird, fällt im Zusammenhang mit dem DGV auf.

Jürgen
KostaK Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: Do 18.02.10 22:39 
Hi Jürgen,

alles schön und gut -> klar hab ich Fehler -> deshalb stelle ich auch Fragen.

Anstatt seitenlange Kritik habe ich eigentlich in diesem Forum Hilfe erwartet.


Gruß Kosta
KostaK Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: Fr 19.02.10 07:57 
Hab die Lösung selber gefunden -> Kosta
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: Fr 19.02.10 10:19 
Nun bin ich aber sehr neugierig, was falsch war. Das wäre auch für künftige Leser dieser Diskussion hilfreich.

Mir geht es übrigens nicht nur darum, eine kurze Lösung hinzuschmeißen. Vor allem dann, wenn grundlegende Probleme auftreten, möchte ich generelle Verbesserungen anregen und allgemeine Erklärungen geben. Das hilft auf die Dauer mehr. Und eine gute Gliederung von Gedanken hilft nicht nur bei Fragen und Antworten, sondern auch beim Programmieren.

Meine Art der Erläuterungen ist also nicht als Schikane zu verstehen, sondern als Hilfe gedacht. Jürgen
KostaK Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 34



BeitragVerfasst: Di 23.02.10 12:35 
Klar doch kein Problem,

ich mußte noch vor dem einfügen des Wertes beginEdit aufrufen da endEdit nicht ausgeführt wird wenn der Datansatz sich nicht im Editzustand befindet.

Wenn es nichts zu editieren gibt wird auch nichts beendet.

Gruß Kosta
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: Di 23.02.10 13:56 
user profile iconKostaK hat folgendes geschrieben Zum zitierten Posting springen:
ich mußte noch vor dem einfügen des Wertes beginEdit aufrufen da endEdit nicht ausgeführt wird wenn der Datansatz sich nicht im Editzustand befindet.

Damit habe ich ebenfalls etwas dazugelernt: Ich bin davon ausgegangen, dass der Edit-Zustand automatisch festgestellt wird, wenn man mit der Eingabe beginnt (so wie sich EndEdit automatisch beim Wechsel des Datensatzes ergibt). Aber offensichtlich gibt es Situationen, in denen BeginEdit ausdrücklich angegeben werden muss. Jürgen