vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
Seltsames 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
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Seltsames Verhalten synchronisierter DataGridViews2.246mquadrat13.04.12 14:59
Re: Seltsames Verhalten synchronisierter DataGridViews1.084Manfred X13.04.12 20:54
Alternative: Row-Zuordnung über eindeutige Schlüsselspalte1.323Manfred X13.04.12 21:54
Re: Seltsames Verhalten synchronisierter DataGridViews1.058mquadrat16.04.12 08:17
Re: Seltsames Verhalten synchronisierter DataGridViews1.311Manfred X16.04.12 18:25

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 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