Laden...

BindingSource Frage

Erstellt von Echo]6[ vor 15 Jahren Letzter Beitrag vor 15 Jahren 5.502 Views
E
Echo]6[ Themenstarter:in
111 Beiträge seit 2006
vor 15 Jahren
BindingSource Frage

verwendetes Datenbanksystem: SQL Server 2005

Schönen guten Abend!

Ich brauche mal kurz eure Hilfe zu folgender Sache. Ich habe ein Fenster indem ich Datensätze anlegen, löschen und ändern möchte. Ich fülle mir also ein Dataset mit einer Tabelle und binde diese an eine BindingSource. Diese Daten zeige ich dann in einem DGV an.


dgvTest.DataSource = bindingsource;

Für die Commands habe ich mir ein SqlCommandBuilder erstellt.

Nun möchte ich gerne per Klick auf den Button "Neu" eine neue Zeile hinzufügen und diese dann nachher per Button "Speichern" in die Datenbank zurückschreiben.

Die neue Zeile erstelle ich folgendermaßen:


private void btnNeu_Click(object sender, EventArgs e)
{
      bindingsource.AddNew();
}

Hier wird nun ein neuer Datensatz erzeugt und dieser auch selektiert!

Gebe ich nun die Daten in die TextBoxen ein und möchte diese Eingaben danach dann speichern, werden zwar die Daten in die Datenbank geschrieben, aber es wird nun ein anderer Datensatz markiert und nicht mehr der gerade neu erstellte!


private void btnSave_Click(object sender, EventArgs e)
{
     bindingsource.EndEdit();
     da.Update(ds, "dt_Test");
}

Wie kann man es nun hinbekommen, dass nach dem Speichern dieser neue Datensatz weiterhin markiert wird?
Die BindingSource lasse ich wohl beim Laden der Daten per "bindingsource.Sort = "Name ASC" sortieren.

Ich hoffe, ihr könnt mir weiterhelfen!

MfG
Echo

P.S. Ist diese Vorgehensweise überhaupt Ok oder kann man das noch eleganter lösen? Über den Designer möchte ich das nämlich nicht machen!

r
158 Beiträge seit 2007
vor 15 Jahren

kommentier mal das BindingSource.Sort=... aus, dann klappt das auch mit der markierung/Selwktion der neu hinzugefügten Zeile...
Übrigens: sobald im DataGrifView über den SpaltenKopf sortiert wird, hast du wieder das gleiche Fänomen und: der akutell selektierte Datensatz ist dann auch ein anderer...scheint mir ein DarstellungsProblem im DGV zu sein 🤔
Im Übrigens ist deine sonstige Vorgehensweise durchaus okay. Allerdings solltest du nach dem da.Update(ds, "dt_Test"); ein dt_Test.AcceptChanges() bzw_bindingSource.DataSource.AcceptChanges()_ nicht vergessen, damit auch alle DataRows intern als unchanged gekennzeichnet werden 😉

i
16 Beiträge seit 2007
vor 15 Jahren

hallo,

versuche mal die Sortierung auf "keine" zu setzen oder füge in deine Tabelle ein IntegerFeld ein (wähle dafür dann bindingsource.Sort = "Nummer ASC" ) und klicke dann im Eigenschaftsfenster bei Indentitätsspezifikation auf das + Zeichen, dann IsIdentity = ja, Schrittweite und Startwert.
Dadurch wird der Wert in diesem Feld autotmatisch erhöht
und Deine Datensätze nach dem Speichern nicht neu sortiert, du bleibst auf dem selektierten Datensatz stehen.
Da du zur Zeit aufsteigende Sortierung gewählt hast, ich nehme an das dies ein Textfeld
ist, wird nach dem Speichern auch der Sortiervorgang in deiner Tabelle durchgeführt,
somit verschieben sich dann die Datensätze in der Reihenfolge.

Beide Methoden müssten funktionieren.
Leider habe ich z. Zt. keinen SQL-Server installiert, um dies testen zu können.
Hoffe es klappt.

MfG
ichnur

E
Echo]6[ Themenstarter:in
111 Beiträge seit 2006
vor 15 Jahren

Hallo!

Ich habe jetzt erstmal die Sortierung rausgenommen, damit es erstmal so läuft. Mein Problem ist jetzt das ich beim Löschen, nachdem ich z.B. einen neuen Datensatz hinzugefügt habe und diesen danach sofort wieder löschen möchte, bekomme ich eine Parallelitätsverletzung.

"Der DeleteCommand hat sich auf 0 der erwarteten 1 Datensätze ausgewirkt."

Das Hinzufügen:


private void btnNeu_Click(object sender, EventArgs e)
{
      bindingsource.AddNew();
}

Das Speichern:


private void btnSave_Click(object sender, EventArgs e)
{
     bindingsource.EndEdit();
     da.Update(ds, "dt_Test");
     ds.Tables[0].AcceptChanges();
}

Und hier das Löschen:


private void btnLoeschen_Click(object sender, EventArgs e)
{
      bindingsource.RemoveCurrent();

      bindingsource.EndEdit();
      da.Update(ds, "dt_Test");
      ds.Tables[0].AcceptChanges();
}

Habt ihr ne Idee, woran das liegen könnte?

Gruß
Echo

P.S. Danke für eure bisherigen Antworten!

F
10.010 Beiträge seit 2004
vor 15 Jahren

Da dein Datensatz garantiert eine AutoID hat, musst Du diese natürlich nach dem speichern auslesen.
Sonst passt der Datensatz nicht mit dem im DataSet überein.

j
3.331 Beiträge seit 2006
vor 15 Jahren

Nur der Vollständigkeit halber: Das **AcceptChanges **in raiguens Vorschlag ist überflüssig; das wird automatisch ausgeführt:

DbDataAdapter.Update-Methode
Bei der Verwendung von Update erfolgt die Ausführung in folgender Reihenfolge:
...
7. AcceptChanges wird aufgerufen.

Jürgen

E
Echo]6[ Themenstarter:in
111 Beiträge seit 2006
vor 15 Jahren

So jetzt läufts!

Das einzige Problem, was ich noch habe ist, dass mit der Sortierung. Wie bekommt man es denn hin, dass beim "BindingSource.AddNew()", automatisch auf den neuen Datensatz gesprungen wird?

Gebe ich nämlich die Sortierung mit "BindingSource = "Name ASC";" an, so wird nicht der neue Datensatz markiert und nachher beim navigieren, sprich "BindingSource.MoveNext();" z.B. wird auch nicht richtig durch die Daten gegangen, wie es z.B. im DGV angezeigt wird.

Gruß
Echo