| |

VB.NET - FortgeschritteneSeltsames Verhalten synchronisierter DataGridViews | |  | Autor: mquadrat | Datum: 13.04.12 14:59 |
| 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 |  |
 | 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 |
  |
|
sevOutBar 4.0 
Vertikale Menüleisten á la Outlook
Erstellen von Outlook ähnlichen Benutzer- interfaces - mit beliebig vielen Gruppen und Symboleinträgen. Moderner OfficeXP-Style mit Farbverläufen, Balloon-Tips, u.v.m. Weitere InfosTipp des Monats Oktober 2025 Matthias KozlowskiUmlaute konvertierenErsetzt die Umlaute in einer Zeichenkette durch die entsprechenden Doppelbuchstaben (aus ä wird ae, usw.) 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
|
|
|
Copyright ©2000-2025 vb@rchiv Dieter Otter Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.
Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel
|
|