Aktualisierung Dataset
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 55 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.
-
-
@ErfinderDesRades
Hmm, kannst Du mir sagen, was genau Du meinst, da ich Deinen Reload-Code, wie in Post#6 beschrieben, verwende.
Grüße -
-
Hmm, mir scheint, wir reden aneinander vorbei oder ich habe es mißverständlich formuliert.
Der Reload-Code
VB.NET-Quellcode
- Private Sub Reload()
- DtsAuftragsbuch.Clear()
- For Each tb As DataTable In DtsAuftragsbuch.Tables
- tb.BeginLoadData() 'deaktiviert während des Ladens AktualisierungsVorgänge des Databindings
- Next
- DtsAuftragsbuch.ReadXml(_DataFile.FullName)
- For Each tb As DataTable In DtsAuftragsbuch.Tables
- tb.EndLoadData()
- Next
- DtsAuftragsbuch.EnforceConstraints = True 'tb.BeginLoadData setzt autom. EnforceConstraints.False - also zurücksetzen
- DtsAuftragsbuch.AcceptChanges()
- End Sub
...welcher in
aufgerufen wird. -
tja, weiss ich auch nicht.
Sieht ok aus.
Der einzige Unterschied zu meim ist, dasss meine PKs ins Negative zählen statt ins Positive.
Kannst du eine Spiel-anwendung basteln, die den Fehler reproduziert, und anhängen?
Das Gehuddel mittm FSW braucht ja noch garnet drinne sein: Einfach nur ein Dingens, wo man mit Buttons Save, Reload die Dataset.xml speichert/lädt.
Und wo dann diese PK-Wunderlichkeit auftritt. -
So gern wie ich das machen würde, ich denke nicht, dass ich das sinnvoll gekürzt bekomme.
Eine Verständnisfrage, das Clear im Reload leert mein Dataset. Ich gehe davon aus, die Struktur bleibt erhalten und nur die Inhalte werden gelöscht. Ich habe den Reload nun mal ohne ReadXML ausgeführt. Scheinbar weiß er dennoch, was die letzte Zeile war, da er mit der Richtigen ID weitermachen würde obwohl die XML nicht neu geladen wurde und egal wie oft ich den Reload ausführe.
Somit würde ich es dahingehend eingrenzen, dass der ReadXML irgendwas veranstaltet was nicht passt.
Vielleicht ist das ja hilfreich für die Fehlersuche. -
ja, weiss ich auch nicht.
kannst dir höchstens eine Solution von mir nehmen, die das Problem nicht hat, und mit deiner vergleichen.
zb Daten laden und speichern
hat so Reload-Buttons, glaubich. -
Ich weiß keinen Rat mehr, ich habe das Phonebook-Projekt mit meinem verglichen. Ich finde keinen Unterschied.
Die PKs habe ich zum Testen auf negative Zählweise umgestellt, gleiches Problem, dann halt nur negativ.
Egal was ich mache, sowie das dts geleert und die xml neu eingelesen wird, rechnet er immer die existierenden Rows zu der eigentlich aktuellen ID hinzu.
Ich könnte mir jetzt nur vorstellen, eine Krücke einzubauen, die die existierenden Rows wieder subtrahiert.
Davon abgesehen das ich nicht wüsste wie ich das umsetzen soll, ist es auch nicht sauber, da es zwar das Problem löst aber die Ursache nicht.
Ich werde wohl aufgeben, außer es hat noch jemand eine Idee.
Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Madde“ ()
-
Was passiert mit einer neuen, von anderen DataTables unabhängigen Dummy-DataTable? Gleiches ID-Problem oder nicht?Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln. -
-
Das einzige, was ich wüsste, wie man das von dir bbeschriebene Verhalten hinkriegen könnte, wäre, dass das iwelche DataTable_Changed-Events verarbeitet sind, und Unfug treiben.
Die werden auch beim Einlesen einer XmlDatei für jeden Datensatz gefeuert.
Abrer ich kann in deine Anwendung ja nicht reingucken. Nur du kannst in meine reingucken, udn da ist sowas ja halt nicht drin. -
Leg doch mal ein neues Projekt an, kopier Dein DataSet-Inhalt rein und bring es zum Laufen (erstmal ohne die XML-Datei). Wenn das mit Testdaten klappt, dann mit XML-Datei. Dann kannst Du viel besser entscheiden, ob es an den Daten liegt (eher nicht), den tDS-Einstellungen (möglich) oder am Projektcoderest (wahrscheinlich).Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln. -
-
Ah, ok. Jetzt kann ich das Problem zumindest nachstellen. Wobei das mit der Nachstellung sich sehr leicht zeigt. Man nehme eine DataTable mit AutoIncrement-Spalte, ein daran gebundenes DGV, bei dem man Zeilen hinzufügen kann und gehe in die letzte Zeile. Es wird eine neue Zeile mit erhöhter ID erstellt. Verlässt man die Zeile ohne Dateneigabe, wird diese Zeile entfernt. Geht man wieder in die letzte Zeile, wird wieder eine neue Zeile erstellt, allerdings nicht mit der gleichen ID, sondern mit der nächsten. Schau mer mal, ob man das tDS bzw. die DataTable dazu bringen kann, die verworfenen Zeilen wieder zu vergessen.
##########
@Madde
Nee, ich glaub das wird nix. Es scheint zwar in der sehr versteckten VariableautoInc
der entsprechenden Column zu stecken, aber da per Reflection rumzuspielen, halte ich für … nicht ratsam. Dann soll der Computer mit den Spaltenwerten machen, was er will. Und Du könntest einfach für nen neuen Auftrag sowas machen:NeuerAuftrag.Auftragsnummer = DeineAuftragstabelle.ErmittleHöchsteAuftragsnummner + 1
. Geht mit der LINQ-Max-Extension.
Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()
-
Ich hab eine Lösung:
VB.NET-Quellcode
- Private Sub Reload()
- DtsAuftragsbuch.Clear()
- For Each tb As DataTable In DtsAuftragsbuch.Tables
- tb.BeginLoadData() 'deaktiviert während des Ladens AktualisierungsVorgänge des Databindings
- Next
- Dim dts = New dtsAuftragsbuch
- dts.ReadXml(datenpfad.FullName)
- DtsAuftragsbuch.Merge(dts, False, MissingSchemaAction.Error)
- dts.Dispose
- For Each tb As DataTable In DtsAuftragsbuch.Tables
- tb.EndLoadData()
- Next
- DtsAuftragsbuch.EnforceConstraints = True 'tb.BeginLoadData setzt autom. EnforceConstraints.False - also zurücksetzen
- DtsAuftragsbuch.AcceptChanges()
- End Sub
-
-
Jetzt bin ich nochmal unverschämt. Folgendes Szenario.
Klick Neuer Auftrag - Zeile wird mit ID angelegt. Nun möchte ich aber den Vorgang abbrechen und die Zeile mit gleicher ID neu beginnen.
TblAuftragsbuchBindingSource.EndEdit()
oderTblAuftragsbuchBindingSource.CancelEdit()
funktionieren da nicht. Er nimmt immer die Folge-ID der soeben gelöschten Zeile.
Scheinbar hat er die soeben vergebene, aber abgebrochene ID noch irgendwo im Bauch, denn der Reload funktiuoniert da nicht.
Lässt sich das, ähnlich dem Reload, umsetzen?
Grüße -
Sowohl den Speicherort der ID als auch den Workaround habe ich gepostet.
Du könntest es wohl mit der Lösung von EdR machen, indem Du beim Auftragsanlegen eben diesen Merge machst.Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.
Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln. -
Ich habe es jetzt so gelöst. Sicher nicht die eleganteste Lösung aber sie funktioniert. Der Programmierer sieht das sicher anders
Damit auch sichergestellt ist, dass der letzte Eintrag verwendet wird und vorher nicht irgendwo ins DGV geklickt wurde, springt er vorher in die letzte Zeile.
VB.NET-Quellcode
- Private Sub ButtonAbbruch_Click(sender As Object, e As EventArgs) Handles ButtonAbbruch.Click
- If dgv.AllowUserToAddRows Then
- dgv.CurrentCell = dgv(0, dgv.Rows.Count - 2)
- Else
- dgv.CurrentCell = dgv(0, dgv.Rows.Count - 1)
- End If
- DtsAuftragsbuch.tblAuftragsbuch.Columns(0).AutoIncrementStep = -1
- DtsAuftragsbuch.tblAuftragsbuch.Columns(0).AutoIncrementSeed = -1
- DtsAuftragsbuch.tblAuftragsbuch.Columns(0).AutoIncrementStep = 1
- DtsAuftragsbuch.tblAuftragsbuch.Columns(0).AutoIncrementSeed = 1
- End Sub
Nochmals Danke für Eure Unterstützung!
Grüße
-
Hallo,
ich möchte kein neues Thema aufmachen, da es ja in dieses Projekt gehört.
Mir gehts um die parallele Verwendung der XML. Da zwei Programminstanzen laufen sollen, ist eine gleichzeitige Nutzung bzw Änderung ja nicht möglich, da einer von beiden rausfliegt.
Was kann ich einbauen, dass während die eine Instanz Änderungen vornimmt, die andere dies gemeldet bekommt und keine Änderungen vornehmen kann, bis die XML nicht mehr in Verwendung ist.
Es muss nichts gewaltiges sein, eine Meldung das die Daten soeben bearbeitet werden reicht vollkommen aus.
Recherchen bringen mich meist zu Filestream aber ich weiß nicht wie ich das umsetzen soll.
Ich wäre euch dankbar, wenn ihr mich in die richtige Richtung bringen könntet.
Grüße
-
Ähnliche Themen
-
sonne75 - - Daten(bank)programmierung
-
3 Benutzer haben hier geschrieben
- Madde (26)
- VaporiZed (15)
- ErfinderDesRades (15)