Laden...

DataSet mit Binding editieren

Erstellt von JustTom vor 15 Jahren Letzter Beitrag vor 15 Jahren 4.645 Views
JustTom Themenstarter:in
93 Beiträge seit 2008
vor 15 Jahren
DataSet mit Binding editieren

Hallo,

ich habe ein DataSet welches an eine Listbox gebunden ist. Ich brauche jedoch die Funktionalität, die Elemente in der ListBox zu verschieben und dabei der OrderIndex in dem DataSet (bzw. später in der Datenbank) zu speichern. Dazu habe ich zwei Buttons erstellt:

  • Button nach oben:
    Wird dieser Button geklickt, wird der OrderIndex mit dem Item SelectedIndex-1 vertauscht.

  • Button nach unten:
    Wird dieser Button geklickt, wird der OrderIndex mit dem Item SelectedIndex+1 vertauscht.

Im Code sieht das folgendermaßen aus (in dem Beispiel Button nach oben):


DataRow rowOld = dataSet.Tables["Objects"].Rows[iIndex];
rowOld["OrderIndex"] = iObjectIndexNew;

DataRow rowNew = dataSet.Tables["Objects"].Rows[iIndex1];
rowNew["OrderIndex"] = iObjectIndexOld;

Das Funktioniert soweit auch, das DataSet stellt Changes fest und ich kann das ganze in der Datenbank speichern. Mein Problem ist jetzt allerdings das es nicht richtig in der ListBox angezeigt wird. Es sieht so aus als ob da kein PropertyChanged Event aufgerufen wird.

Gibt es da eine andere Möglichkeit?

Gruß,
Tom

Gruß,
Tom

582 Beiträge seit 2008
vor 15 Jahren

Das Problem liegt wahrscheinlich daran, das du deine Listbox per WPF gebunden hast. Dadurch wird ein DataView erzeugt, welches nicht die Tabelle selbst ist und unabhängig funktioniert.

Also nutze auch genau diese DataRow und dann wird die auch zurück in die Tabelle geschrieben...


((DataRowView)MeinListView.Items.CurrentItem)["OrderIndex"] //Damit auf die DataView

((DataRowView)MeinListView.Items.CurrentItem).Row["OrderIndex"] //Damit greifst du auf die Datentabelle zu



Probiere dies mal aus. Am besten auch in dieser Reihenfolge. Da ersteres Beispiel die Daten im erzeugten DataView ändert und du somit die nicht die Automation (z.B. berechnete Spalten) dieses DataView´s beeinflusst.

Gruß dat Tala

JustTom Themenstarter:in
93 Beiträge seit 2008
vor 15 Jahren

Hallo,

danke schonmal für die rasche Hilfe. Hab jetzt beide Varianten probiert, jedoch kein Unterschied. Wäre es eine gute Lösung, den ListBox Items eine SortDescription hinzuzufügen?

Gruß,
Tom

Gruß,
Tom

582 Beiträge seit 2008
vor 15 Jahren

Nein macht kein unterschied.

Zeig mal dein Databinding

Gruß dat Tala

JustTom Themenstarter:in
93 Beiträge seit 2008
vor 15 Jahren

Ja, stimmt weil dann nur die Items in der Listbox sortiert werden aber nicht das DataSet...

sqlConn = new SqlConnection(sqlConnString);

dataSet = new DataSet();

sqlDataAdapter = new SqlDataAdapter("SELECT MaskenID, Name FROM Masken ORDER BY MaskenID", sqlConn);
sqlDataAdapter.Fill(dataSet, "Masken");
sqlDataAdapter.SelectCommand.CommandText = "SELECT * FROM Objects ORDER BY ObjectIndex DESC";
sqlDataAdapter.Fill(dataSet, "Objects");
dataSet.Relations.Add("Masks2Objects",
                                    dataSet.Tables["Masken"].Columns["MaskenID"],
                                    dataSet.Tables["Objects"].Columns["MaskenID"],
                                    false);

DataContext = dataSet.Tables["Masken"];
sqlCmdBuilder = new SqlCommandBuilder(sqlDataAdapter);

Und der WPF Code für das ListBox Element:
<ListBox Name="lbElemente" ItemsSource="{Binding Masks2Objects}" DisplayMemberPath="ObjectName" SelectedValuePath="ObjectID" />

Gruß,
Tom

Gruß,
Tom

582 Beiträge seit 2008
vor 15 Jahren

Meine Vermutung liegt darin, das es sich hierbei um ein Problem in der sqlDataAdapter liegt. Dann bin ich der verkehrte Ansprechpartner, da ich nur mit XML Datenbanken arbeite.

Probiere mal folgendes. Ein neuer Button der dein folgeden Code ausführt um eine XML Datenbank zu erzeugen und auf dei Platte zu schreiben.

dataset.writeXML("c:\testdatenbank.xml");

Dann entferne deine Befüllung DataSets vom TableAdapter. Lese statt dessen deine Daten so ein. (Deine Relation muß trotzdem erzeugt werden)

dataset.readXML("c:\testdatenbank.xml");

Und arbeite erst mal nur mit deser XML-Datenbank. Falsche Datenbankverbindungen oder Schreibfehler/Rückschreibfehler usw kann man dann ausschließen.

Probiere dann noch mal deinen Code aus mit den beiden Beispielen von oben.

Evtl mußt du auch noch deiner Datenbank mitteilen das die Änderungen übernommen werden müssen. (ein schnell übersehendes Problem).

dataSet.AcceptChanges()

Gruß dat Tala

582 Beiträge seit 2008
vor 15 Jahren

Arg. Klar. Total übersehen

WPF hinzufügen IsSynchronizedWithCurrentItem="True"

Und natürlich Sortiert die Listbox nicht, wenn du keine Sortdesciption hinzupackst.

Gruß dat Tala

JustTom Themenstarter:in
93 Beiträge seit 2008
vor 15 Jahren

Meine Vermutung liegt darin, das es sich hierbei um ein Problem in der sqlDataAdapter liegt. Dann bin ich der verkehrte Ansprechpartner, da ich nur mit XML Datenbanken arbeite.

Probiere mal folgendes. Ein neuer Button der dein folgeden Code ausführt um eine XML Datenbank zu erzeugen und auf dei Platte zu schreiben.

dataset.writeXML("c:\testdatenbank.xml");

Dann entferne deine Befüllung DataSets vom TableAdapter. Lese statt dessen deine Daten so ein. (Deine Relation muß trotzdem erzeugt werden)

dataset.readXML("c:\testdatenbank.xml");

Und arbeite erst mal nur mit deser XML-Datenbank. Falsche Datenbankverbindungen oder Schreibfehler/Rückschreibfehler usw kann man dann ausschließen.

Probiere dann noch mal deinen Code aus mit den beiden Beispielen von oben.

Evtl mußt du auch noch deiner Datenbank mitteilen das die Änderungen übernommen werden müssen. (ein schnell übersehendes Problem).

dataSet.AcceptChanges()

Das mit dem XML File kann ich mal probieren. Das mit dem dataSet.acceptChanges() hab ich ausprobiert, hat mir aber nichts geholfen, abgesehen davon das ich gar nicht mehr in die Datenbank speichern kommt (also dataSet.HasChanges() ist dann nicht mehr true...)

Arg. Klar. Total übersehen

WPF hinzufügen IsSynchronizedWithCurrentItem="True"

Und natürlich Sortiert die Listbox nicht, wenn du keine Sortdesciption hinzupackst.

Sry, IsSynchronizedWithCurrentItem="True" ist natürlich dabei, hab ich total vergessen zum kopieren. Und das mit der Sortdescription hab ich auch schon probiert, ergab jedoch keine Änderung.

ataSet.Tables["Objects"].DefaultView.Sort = "ObjectIndex DESC"

Noch dazusagen muss ich das ich das OrderIndex == ObjectIndex (nur halt leichter verständlich) - im Bezug auf früheren Post

Gruß,
Tom

582 Beiträge seit 2008
vor 15 Jahren

Du sagst, das die änderungen nicht in der ListView angezeigt werden, du verwendest allerdings auch kein DataTemplate. Daher sollte nur ObjectName angezeigt werden. Wie also stellst du also fest, ob der wert tatsächlich geändert ist?

Gruß dat Tala

JustTom Themenstarter:in
93 Beiträge seit 2008
vor 15 Jahren

Mit if (DataSet.HasChanges()) ...

Gruß,
Tom

582 Beiträge seit 2008
vor 15 Jahren

Ok. Und schon mal wirklich abgefragt, ob der entsprechende Datensatz sich geändert hat? Also die Rohdaten? Nicht selten bekommt das "HasChanges" einen True, wenn dies gar nicht der fall ist?

Was genau wird denn dann nicht richitg in der Listbox angezeigt?

Gruß dat Tala

JustTom Themenstarter:in
93 Beiträge seit 2008
vor 15 Jahren

Also hier nochmal ein Screenshot damits deutlicher wird:
(im Anhang)

Ich kann also unten bei der GroupBox "Elemente hinzufügen" neue Elemente der Listbox anfügen, mit folgendem ButtonEvent:


DataRow newRow = dataSet.Tables["Objects"].NewRow();
newRow["ObjectName"] = stringElementName;
newRow["GeometryID"] = geometryID;
newRow["MaskenID"] = lbMasken.SelectedValue;
newRow["ObjectIndex"] = iNextObjectIndex;
newRow["CorWidth"] = 10;
newRow["CorHeight"] = 10;
//...
dataSet.Tables["Objects"].Rows.Add(newRow);

Sobald ich also auf den Button klicke, wird sofort ein Element der Listbox angefügt, genauso wie es sein soll.

Jetzt zu meinem Problem, dem Verschieben:
Wähle ich ein Element aus, drücke auf der rechten Seite den Pfeil nach oben oder den Pfeil nach unten, dann wird der ObjectIndex vertauscht, die anzeige verändert sich allerdings nicht.

Ich hoffe jetzt wird das klarer...

Danke für die Geduld und auch für die Hilfssversuche 😉

Gruß,
Tom

582 Beiträge seit 2008
vor 15 Jahren

Ok. Dann mußt du tatsächlich eine Sortierung der Listbox machen.


lbElemente.Items.SortDescriptions.Add(new SortDescription("ObjectIndex", ListSortDirection.Ascending));

Gruß dat Tala