Laden...

DataBinding an TextBox: Gebundenen Wert speichern

Erstellt von Da_Flo vor 13 Jahren Letzter Beitrag vor 13 Jahren 4.508 Views
D
Da_Flo Themenstarter:in
269 Beiträge seit 2009
vor 13 Jahren
DataBinding an TextBox: Gebundenen Wert speichern

Hallo!

Ich hätte mal folgendes probiert:

DA = new SqlDataAdapter("Select * FRom Mitarbeiter where nr = 26", Data.Connection);
            DS = new DataSet();
            DA.Fill(DS);
            DT = DS.Tables[0];

            textBox1.DataBindings.DefaultDataSourceUpdateMode = DataSourceUpdateMode.OnValidation;
            textBox1.DataBindings.Add("Text", DT, "Vorname");

mittels keyDown event fange ich ab ob enter gedrückt worden ist und will die daten in die Datenbank spielen:

private void textBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData == Keys.Enter)
            {
                DA.Update(DS);
               // String s = DS.Tables[0].Rows[0]["Vorname"].ToString();
            }
        }

im DataSet wird der Wert abgeglichen und es steht der Wert drinnen der auch in der Textbox steht. Allerdings wird mit DA.Update(DS) der neue wert nicht in die Datenbank geschrieben. Woran kann das liegen?

Danke
Flo

D
Da_Flo Themenstarter:in
269 Beiträge seit 2009
vor 13 Jahren

Sehe ich das richtig das bei DataAdapter.Update(DataTable)
nur jene Zeilen in der DataTable upgedatet werden die den RowState Modified haben?
Hab nämlich jetzt mal überprüft. Also das was ich in der Textbox ändere steht sofort in der DataTable, allerdings bleibt der RowState auf Unchanged.

Ich hätte jetzt probiert das ich den RowState mittels setModified() setze. Allerdings wird dan wieder der Ursprüngliche Wert in die Textbox geschrieben!

public void update()
            {
                String s = DT.Rows[0]["Firmenname"].ToString();
                DT.Rows[0].SetModified();
                String s1 = DT.Rows[0]["Firmenname"].ToString();
                DA.Update(new DataRow[] {DT.Rows[0]});

            }

s ist der Geänderte String, nach SetModified() steht in s1 wider der Ursprüngliche Text drinnen!

F
10.010 Beiträge seit 2004
vor 13 Jahren

Du machst hier mehrer Fehler die alle darauf zurückzuführen sind das dir die Grundlagen fehlen.

1.

DA = new SqlDataAdapter("Select * FRom Mitarbeiter where nr = 26", Data.Connection);

Du benutzt hier doch nicht etwa eine globale SqlConnection?

  1. Wenn du nur eine DataTable brauchst, lege nicht ein DataSet an.

  2. Den UpdateMod kann man direkt in der Add Methode machen.

  3. Trotz des UpdateModes ist bei dir der eigentliche EditMode noch nicht abgeschlossen, erst dieser überträgt die Daten als geändert in die DataTable.
    EndEdit der benutzten BindingSource wäre hier wichtig.
    Und OnValidation ist auch der Falsche Wert.

  4. Globaler DataAdapter ist sehr Fehleranfällig und sollte durch einen vernünftigen DAL ersetzt werden.

  5. da.Update(ds) sollte dir eigentlich eine Fehlermeldung ergeben, denn der da weiss garnicht welche Tabelle du meinen könntest.

D
Da_Flo Themenstarter:in
269 Beiträge seit 2009
vor 13 Jahren

Hallo!
Danke für die Antwort!

Du benutzt hier doch nicht etwa eine globale SqlConnection?

Nein Data.Connection erstellt mir ne neue SqlConnection und gibt diese zurück!


bs = new BindingSource();
bs.DataSource = table;
TB_ST_Firmenname.DataBindings.Add(new Binding("Text", bs, "Firmenname"));
TB_ST_Firmenname.DataBindings.DefaultDataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged;

im click event auf dem "Speichern"-Button mach ich dan:


bs.EndEdit();
DA.Update(DT);

jetzt hätte ich den RowState auf Modified bevor das Update ausgeführt wird, allerdings wird der Wert trotzdem nicht in die Datenbank übernommen!

Edit:

Durch den SqlcommandBuilder wurde irgendwie kein UpdateCommand erstellt, und deswegen ändert sich auch nichts in der Datenbank!

Allerdings wäre es besser ich könnte es mit dem ComandBuilder lösen, da es ein großer aufwand ist ein updatecommand für 50 spalten zu machen!
Woran kann das liegen das der commandBuilder streikt?

F
10.010 Beiträge seit 2004
vor 13 Jahren

Du brauchst da keine Connection, ein ConnectionString reicht.

Und auch die BindingZeilen sind zu umständlich.

Wenn der CommandBuilder keine Commands erzeugt, gibt es immer eine Exception.
Die wirst Du wahrscheinlich wegfangen.

Hat die Tabelle einen PK?

D
Da_Flo Themenstarter:in
269 Beiträge seit 2009
vor 13 Jahren

Du brauchst da keine Connection, ein ConnectionString reicht.

Alles klar, wusste ich nicht, hab ich mir so angewöhnt!

Und auch die BindingZeilen sind zu umständlich.

die hätte ich jetzt so:

TB_ST_Firmenname.DataBindings.Add("Text", bs, "Firmenname",false,DataSourceUpdateMode.OnPropertyChanged);

Wenn der CommandBuilder keine Commands erzeugt, gibt es immer eine Exception.
Die wirst Du wahrscheinlich wegfangen

Ich hätt jetzt in einen Brekpoint bei DA.Update() gesetzt, und da kann ich ablesen das der UpdateCommand = null ist, allerdings wird keine Exception geworfen!
EDIT: Hab jetzt dem DataAdapter mittels

DA.UpdateCommand=builder.GetUpdateCommand()

ein UpdateCommand zugewiesen, allerdings tut sich trotzdem nichts 😕
Der UpdateCommand sieht so aus:

UPDATE [bestellung] SET [nr] = @p1, [Datum] = @p2, [Bestellnr] = @p3 WHERE (([nr] = @p4) AND ([Datum] = @p5) AND ([Bestellnr] = @p6))

da ist mir schon klar warum da nichts upgedatet wird. Erstellt der normalerweise nicht ein Set für jede spalte?

try
                {
                    DA.Update(DT);
                }
                catch (Exception ex)
                {
                    System.Windows.Forms.MessageBox.Show(ex.Message);
                }

Hat die Tabelle einen PK?

Ja

D
Da_Flo Themenstarter:in
269 Beiträge seit 2009
vor 13 Jahren

Ich habs!
das Problem war das ich bei allen spalten wo NULL sein kann im Select folgendes gemacht habe

Select ISNULL(be.Firmenname,'') as 'Firmenname' Bestellung

Wenn ich select Firmenname from Bestellung mach gehts.
Mal schaun was da passiert wenn ich nen Null-Value an de Textbox, etc binde

D
24 Beiträge seit 2009
vor 13 Jahren

Mal schaun was da passiert wenn ich nen Null-Value an de Textbox, etc binde

Dann bleibt die Textbox einfach leer ^^

D
Da_Flo Themenstarter:in
269 Beiträge seit 2009
vor 13 Jahren

Dann bleibt die Textbox einfach leer ^^

Ja genau^^, nur bei etc(damit meinte ich CheckBox) sieht das leider anders aus

F
10.010 Beiträge seit 2004
vor 13 Jahren

Wieder etwas wo deine Grundlagen löcherig sind.

Der CommandBuilder wird normalerweise vom DataAdapter beim ausführen des Updates nach den Commands gefragt, da erst dann normalerweise die Connection besteht.
Deshalb gibt es vorher auch eigentlich kein Command.

Und woher sollten wir das mit dem SelectCommand wissen?
Wie ich oben schon schrieb sind globale Adapter ziemlich häufig für Seiteneffekte zuständig, hier hast du schon mal einen.
Wieder ein Grund mal über OOP nachzudenken und einen vernünftigen DAL implementieren.

D
Da_Flo Themenstarter:in
269 Beiträge seit 2009
vor 13 Jahren

Da ich mir eigentlich das meiste mit "Learning-By-Doing" bzw mit Codeschnipsel aus dem Internet angeeignet habe, fehlen mir natürlich solche Zusammenhänge wie das alles wirklich funktioniert.

Aber da wir gerade die gesamte Software neu strukturieren wollen werd ich mir mal ansehn wie so ein DAL aussieht und ob sich der aufwand(wenn es den einer ist) lohnt!

F
10.010 Beiträge seit 2004
vor 13 Jahren

Aber da wir gerade die gesamte Software neu strukturieren wollen..

Bisher war ich davon ausgegangen das Du das für private Zwecke benötigst.
Wenn das aber kommerziell genutzt wird solltest du eher mal überlegen die Grundlagen zu erlernen, denn das was Du im Moment machst hat nicht wirklich etwas mit Software Entwicklung zu tun.
Es ist eher ein zusammenfrickeln von gefundenem.