Hi,
mir hat in den letzten Tagen in einem meiner VB-Projekte folgendes Problem mit 2 DataGridViews einiges an Zeit geraubt.
Ich habe ein Formular mit 2 DataGridViews, beide zeigen Zeitreihen an (1.Spalte ist die Zeit, in den weiteren sind Daten vorhanden). Beide haben die gleiche Anzahl an Zeilen, und beinhalten die gleichen Zeitpunkte. Die Zeitpunktspalte kann allerdings nur in einem der beiden editiert werden. Meine Aufgabe ist nun, die Änderungen an der einen Zeitspalte auf die Zeitspalte des anderen DataGridViews zu übernehmen.
Beiden DataGridViews liegt eine DataTable zugrunde, welche über ein DataView, das die Daten nach der Zeit sortiert, in jeweils einem DataGridView angezeigt wird. D.h. jedes mal wenn in dem einen DataGridView ein Zeitpunkt sich ändert, wird die Liste neu sortiert; diese neue Sortierung muss dann auf das andere DataGridView übernommen werden. Meine Lösung hierfür ist unten im Codeabschnitt unter CellEndEdit() zu sehen.
Das "upper" DataGridView, DataGridView2, ist jenes in welches kopiert werden soll, das "lower" DataGridView, DataGridView1, das aus dem kopiert wird.
Soweit so gut, das scheint prinzipiell zu funktionieren. Nur leider treten, je nachdem in welcher Reihenfolge ich in DataGridView1 die Zeitpunkte ändere, manchmal (für mich) unerklärliche Fehler auf, sodass die Synchronisation der Zeitsortierung fehlerhaft wird.
Ich habe das Problem in einem Beispielprojekt isolieren können, welches nur aus den beiden DataGridViews besteht. Der Fehler ist folgendermaßen reproduzierbar:
Public Class Form1
Dim dt1,dt2 As DataTable
Dim dv1,dv2 As DataView
'how to reproduce the behaviour
'0.1. enter data ONLY in the lower gridview's 1st column
'0.2. during steps 1-3, use only arrow keys to move inside the lower
' gridview
'0.3. during steps 1-3, always leave the focus on the lower gridview
'1. enter 7 in column 0 row 2 (0-indexind, this is the third row)
' -> order in upper gridview changes correctly
'2. enter 6 in column 0 row 1
' -> order in upper gridview changes correctly
'3. enter 5 in column 0 row 0
' -> ERROR 1: order in upper gridview does not change
'3.1. to overcome error 1, click into the upper gridview -> the gridview
' will be ordered
'4. click into the lower gridview again, into column 0 row 1 (DO NOT click
' into any other cell inbetween), and enter 8
' -> ERROR 2: order in upper gridview does not change, and even won't if _
you click into the upper gridview
' -> this error does sometimes not occur if you click into any other
' cell inbetween (hence the hint at the beginning)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.Load
dt1 = New DataTable
dt2 = New DataTable
dt1.Columns.Add()
dt1.Columns.Add()
dt2.Columns.Add()
dt2.Columns.Add()
dt1.Columns(0).DataType = GetType(System.Double)
dt1.Columns(1).DataType = GetType(System.Double)
dt2.Columns(0).DataType = GetType(System.Double)
dt2.Columns(1).DataType = GetType(System.Double)
dt1.Rows.Add()
dt1.Rows.Add()
dt1.Rows.Add()
dt2.Rows.Add()
dt1.Rows.Add()
dt2.Rows.Add()
dt2.Rows.Add()
dt2.Rows.Add()
dt1.Rows(0).Item(0) = 1
dt1.Rows(0).Item(1) = 1
dt1.Rows(1).Item(0) = 2
dt1.Rows(1).Item(1) = 2
dt1.Rows(2).Item(0) = 3
dt1.Rows(2).Item(1) = 3
dt1.Rows(3).Item(0) = 4
dt1.Rows(3).Item(1) = 4
dt2.Rows(0).Item(0) = 1
dt2.Rows(0).Item(1) = 1
dt2.Rows(1).Item(0) = 2
dt2.Rows(1).Item(1) = 2
dt2.Rows(2).Item(0) = 3
dt2.Rows(2).Item(1) = 3
dt2.Rows(3).Item(0) = 4
dt2.Rows(3).Item(1) = 4
dv1 = New DataView(dt1)
dv2 = New DataView(dt2)
dv1.Sort = dt1.Columns(0).Caption
dv2.Sort = dt2.Columns(0).Caption
DataGridView1.DataSource = dv1
DataGridView2.DataSource = dv2
End Sub
Private Sub DataGridView1_CellEndEdit(ByVal sender As Object, ByVal e As _
System.Windows.Forms.DataGridViewCellEventArgs) Handles _
DataGridView1.CellEndEdit
'write BIG values in all fields of the sorted row, bottom to top so
' that the row order is not changed during this in the upper gridview
For i As Integer = 3 To 0 Step -1
DataGridView2.Item(0, i).Value = 1000000000 + i
Next
'copy the entries from the lower gridview into the upper one
For i As Integer = 0 To 3
DataGridView2.Item(0, i).Value = DataGridView1.Item(0, i).Value
Next
End Sub
End Class Hierbei handelt es sich um den kompletten Code des Projekts.
Hat jemand eine Idee was genau da passiert?
Vielen Dank im Voraus für eure Ideen!
Martin |