| |
VB.NET - FortgeschritteneHat ein DataTable sich geändert | | | Autor: henrikl2000 | Datum: 29.10.14 16:14 |
| Wie kann ich beim Exit meines Programmes wissen ob ein DataTable sich geändert hat.
Beim Load Ereignis wird eine Kopie von meiner DataTable gemacht.
Ich habe es in FormClosing mit GetChanges versucht aber das funktioniert nicht.
If dtEngine.GetChanges Is Nothing Then
MsgBox("No changes")
Else
MsgBox("Changes made")
End If Kann man einfach 2 DataTables vergleichen wäre das vielleicht eine Möglichkeit. 0 | |
Re: Hat ein DataTable sich geändert | | | Autor: Manfred X | Datum: 29.10.14 18:09 |
| Hallo!
Man kann den Inhalt von 2 Datatable-Instanzen vergleichen.
Wie wird die Datatable beim Programmstart gefüllt? Datenquelle?
Geht es um das Erkennen von Änderungen der geladenen Daten oder
des Inhalts der Datenquelle?
Änderungen seit wann?
Seit dem letzten Update der Datenquelle?
Seit dem aktuellen Programmstart?
Seit dem letzten (davor liegenden) Start des Programms?
Wodurch können Änderungen zustande kommen?
Durch den Benutzer-Dialog? Durch den Programmcode (Algorithmen)?
In solchen Fällen: Bei Datenzuweisungen eine Kennung setzen!
Kann es vorkommen, daß Änderungen wieder rückgängig gemacht
werden (UNDO)?
Besitzen die Datensätze eine eindeutige ID (Schlüssel)?
Werden im Programm komplette Datensätze hinzugefügt oder
gelöscht? Auch Spalten? Oder werden nur Zellinhalte modifiziert?
Kann es während der Programmausführung zum Nachladen von Daten aus
der Quelle kommen? Ist es möglich, daß dabei auch andere Table-Eigenschaften
neu gesetzt werden (z.B. Spalten-Ensemble, Spalten-Header, Valuetypes)?
Welche Zielsetzung ist mit dem Erkennen von Änderungen beim Programm-EXIT
verbunden? Durchführen eines Update der Datenquelle?
Hinweis an den Benutzer? Aktualisieren eines Änderungsprotokolls?
Wie differenziert soll die Reaktion sein? Ein allgemeiner Hinweis
oder detailliert (geänderte Zeilen, geänderte Zellen?)
usw.
Beitrag wurde zuletzt am 29.10.14 um 18:27:05 editiert. | |
Re: Hat ein DataTable sich geändert | | | Autor: Christoph1972 | Datum: 29.10.14 18:11 |
| Hi,
was ist denn mit .GetChanges()? Bei mir funktioniert das.
Gruß
Christoph
| |
Re: Hat ein DataTable sich geändert | | | Autor: henrikl2000 | Datum: 29.10.14 20:46 |
| Hallo,
Beim Start des Programms wird eine Datei eingelesen und eine DataTable (dtEngine) wird mit diesen Daten gefüllt. Dasselbe kann mit einem Button gemacht werden.
Eine Kopie der DataTable wird erstellt (dtUndo).
Was ich beim Abschluss meines Programms gerne wissen möchte. Ist Änderungen in dtEngine Zeit einlesen der Daten gemacht worden.
Änderungen in dtEngine können unterwegs mit Verschiebung von ein oder mehrere DataPoints passieren.
Ich habe mit folgendem Code inzwischen eine Lösung. Ich bin mir aber nicht sicher ob dass die beste Lösung ist. Ich meine es gibt sicher ein einfacher und eleganter Lösung.
Private Sub frmMain_FormClosing(sender As Object, e As _
System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
Dim IsEqual As Boolean = True
For i = 0 To dtEngine.Rows.Count - 1
If Not dtEngine.Rows(i).Item(2).Equals(dtUndo.Rows(i).Item(2)) Or _
Not dtEngine.Rows(i).Item(3).Equals(dtUndo.Rows(i).Item(3)) Then
IsEqual = False
End If
Next
If IsEqual = False Then
Dim Answer As MsgBoxResult
Answer = MsgBox("You have made changes. Do you want to save the" & _
"changes?", MsgBoxStyle.YesNo, "Changes made")
If Answer = MsgBoxResult.Yes Then
MsgBox("Saving")
End If
End If
End Sub 0 | |
Re: Hat ein DataTable sich geändert | | | Autor: Manfred X | Datum: 29.10.14 21:26 |
| Wenn Du während der Programmausführung die Datatable-Methode
"AcceptChanges" nicht aufrufst, sollten ggf. die geänderten Zeilen
durch "GetChanges" abgerufen werden können.
Ein Abgleich der Daten mit einer zweiten DataTable-Instanz wäre
unnötig.
Wie trägst Du die Änderungen in die Datatable ein?
(Unmittelbar nach dem vollständigen Füllen der Table beim
Programmstart - aus der Datei - solltest Du "AcceptChanges" rufen.)
Per Datenbindung? Per Code?
Was machst Du sonst noch mit der Table? Weitere Daten laden o.ä.?
Übrigens:
Die Abfolge der Zeilen in einer Datatable (Rows-Auflistung) sollte
stets als "nicht definiert" betrachtet werden.
Tables sollten deshalb eine Spalte besitzen, in der für jede Zeile
eine eindeutige Kennung eingetragen ist.
Beitrag wurde zuletzt am 29.10.14 um 21:52:56 editiert. | |
Re: Hat ein DataTable sich geändert | | | Autor: henrikl2000 | Datum: 30.10.14 08:44 |
| Hallo,
Danke für deine immer schnelle Antwort.
Ich habe jetzt wie du es vorschlägt. AcceptChanges gleich nach ausfüllen von der Table beim Programmstart gesetzt.
Und jetzt funktioniert es mit Getchanges.
Ich verwende die Table in mein Chart um DataPoints zu setzen.
Dim dp As New DataPoint
dp.XValue = CInt(dtEngine.Rows(i).Item(0)) ' RPM
dp.YValues = {CInt(dtEngine.Rows(i).Item(3))} ' HP Bei Änderungen wird die Table mit den Änderungen auf datiert. Beim Speichern der Daten wird die Table gebraucht um eine existierende Datei auf zu datieren.
Das hier unten habe ich nicht ganz verstanden. Meinst du damit dass ich eine Spalte machen soll für eine ID?
Ich habe in meiner DataTable Spalten für RPM, Brake, Torque und HP
Die Spalte RPM wird mit Daten gefüllt die nicht gleich sind also eindeutig.
Übrigens:
Die Abfolge der Zeilen in einer Datatable (Rows-Auflistung) sollte
stets als "nicht definiert" betrachtet werden.
Tables sollten deshalb eine Spalte besitzen, in der für jede Zeile
eine eindeutige Kennung eingetragen ist. 0 | |
Re: Hat ein DataTable sich geändert | | | Autor: Manfred X | Datum: 30.10.14 12:55 |
| Die Zeilen in einer Datatable bilden eine Auflistung.
Es können deshalb Zeilen gelöscht, eingefügt oder angehängt werden.
Durch solche Operationen verändert sich der Bezug zwischen
dem "rowindex" und der Datenzeile, die dadurch abgefragt wird.
Aus diesem Grund benötigt man eindeutige Schlüssel, wenn man
Datensätze in Tables auf den Inhalt einer Datenbank oder auf
andere Tables beziehen will. Schlüssel können über mehrere Spalten
definiert sein.
Hier ein Beispiel für eine Beziehung zwischen zwei Tabellen
in einem Dataset über eine Datarelation (per PrimaryKey).
Private Sub TableRelation()
Dim dt1 As New DataTable
dt1.Columns.Add("RPM", GetType(Integer))
dt1.Columns.Add("Sound", GetType(String))
With dt1.Rows
.Add(1000, "surr")
.Add(1200, "brumm")
.Add(1500, "brumm")
.Add(2500, "pfeif")
.Add(4000, "rassel")
.Add(5000, "schepper")
.Add(6000, "kaputt")
End With
dt1.PrimaryKey = {dt1.Columns("RPM")} 'eindeutiger Schlüssel
Dim dt2 As New DataTable
dt2.Columns.Add("RPM_2", GetType(Integer))
dt2.Columns.Add("Sound", GetType(String))
With dt2.Rows
.Add(2500, "brumm")
.Add(4000, "quietsch")
.Add(6000, "jaul")
.Add(1500, "surr")
.Add(1200, "surr")
.Add(1000, "surr")
End With
dt2.PrimaryKey = {dt2.Columns("RPM_2")} 'eindeutiger Schlüssel
'gemeinsames Dataset
Dim ds As New DataSet("RPM_Set")
ds.Tables.Add(dt1) : ds.Tables.Add(dt2)
'Beziehung zwischen Tabellen über eine Datarelation
Dim dr As New DataRelation _
("RPM_Relation", dt1.Columns("RPM"), dt2.Columns("RPM_2"), True)
ds.Relations.Add(dr)
For r1 As Integer = 0 To dt1.Rows.Count - 1
'korrespondierende Zeilen zur r-Zeile in dt1 '
'per Relation aus dt2 abfragen
Dim rows_in_dt2 As DataRow() = dt1.Rows(r1).GetChildRows(dr)
If rows_in_dt2.Count = 0 Then
Console.WriteLine _
(dt1.Rows(r1)("RPM").ToString & _
" keine Entsprechung in Tabelle 2")
Else
For rc As Integer = 0 To rows_in_dt2.Count - 1
Console.WriteLine _
(dt1.Rows(r1)("RPM").ToString & "--->" & _
rows_in_dt2(rc)("Sound").ToString)
Next rc 'Childrows zur row r1 ind dt1
End If
Next r1
End Sub
Beitrag wurde zuletzt am 30.10.14 um 12:56:58 editiert. | |
Re: Hat ein DataTable sich geändert | | | Autor: henrikl2000 | Datum: 30.10.14 13:11 |
| Danke für deine Auskunft reiche Beschreibung. 0 | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
Neu! sevEingabe 3.0
Einfach stark!
Ein einziges Eingabe-Control für alle benötigten Eingabetypen und -formate, inkl. Kalender-, Taschenrechner und Floskelfunktion, mehrspaltige ComboBox mit DB-Anbindung, ImageComboBox u.v.m. Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|