Inhalt zweier DataGridViews bei Form.Load vergleichen

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Michael B..

    Inhalt zweier DataGridViews bei Form.Load vergleichen

    Hallo Zusammen,

    Mittels Me.Load erstelle ich mehrere Tabs in einem TabControl. Mit der Funktion CheckAddressesBetweenTabsAndJDEFile möchte ich, nachdem alle Daten geladen worden sind, diese überprüfen und ggf. Änderungen daran vornehmen.

    Das Problem das ich habe ist, dass der Aufruf der Sub über das Ereignis Me.Load wohl ausgeführt wird, aber an den DataGridViews der Tabs keine Änderungen erfolgen. Erst wenn ich das entsprechende Tab aktiviere und dann die Sub mittels eines zusätzlichen Button erneut anstosse, wird diese korrekt abgearbeitet.

    Ich habe schon ziemlich viel rumprobiert, damit die Sub auch aus Me.Load funzt, bin aber zu keinem brauchbaren Ergebnis gekommen. Hat jemand eine Idee, wo ich noch ansetzen könnte. ?(

    frmMain_Load:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub frmMain_Load(sender As Object, e As System.EventArgs) _Handles Me.Load
    2. .
    3. .
    4. .
    5. ' Load tabs from CONFIG folder
    6. ReadExistingTabFiles(SAVE_PATH_CONFIG, TabFiles)If TabFiles.Count > 0 Then AddPLCSpyTabsOnFormLoad(TabFiles)
    7. With dgvTagBrowser.Columns.Add("Index", "Index")
    8. .Columns.Add("Name", "Name").Columns.Add("Type", "Type")
    9. .Columns.Add("Address", "Address")Dim Check As New DataGridViewCheckBoxColumn()
    10. With Check
    11. .HeaderText = "Check"
    12. .Name = "Check"
    13. End With
    14. .Columns.Add(Check).Columns.Add("Value", "Value")
    15. .Columns(dgvTagBrowserColumns.Value).Visible = False
    16. End With
    17. ' Load *.jde-file if exists
    18. If System.IO.File.Exists(SAVE_PATH_CONFIG & FILENAME_JDE) Then
    19. If LoadJDELoad(SAVE_PATH_CONFIG & FILENAME_JDE) Then
    20. FillDataGridViewTagBrowser()
    21. End If
    22. .
    23. .
    24. .
    25. CheckAddressesBetweenTabsAndJDEFile()
    26. End Sub



    CheckAddressesBetweenTabsAndJDEFile:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Sub CheckAddressesBetweenTabsAndJDEFile()For Each tp As TabPage In tcPLCSpy.TabPages
    2. If tp.Text = tpPLCSpyPreSelection.Text Then Exit ForDim dt As DataTable = DataTableDictionary.Item(tp.Tag)
    3. Dim dgvTab As DataGridView = tp.Controls("dgv" & tp.Text)For Each dgvrTab As DataGridViewRow In dgvTab.Rows
    4. dgvrTab.Cells(dgvPLCSpyOutputColumns.Name).Style.BackColor = Color.Red
    5. If Not dgvrTab.Cells(dgvPLCSpyOutputColumns.Address).Style.BackColor = Color.Orange ThendgvrTab.Cells(dgvPLCSpyOutputColumns.Address).Style.BackColor = Color.Red
    6. End If
    7. NextFor Each dgvrTab As DataGridViewRow In dgvTab.Rows
    8. For Each dgvrJDE As DataGridViewRow In dgvTagBrowser.Rows
    9. If dgvrTab.Cells(dgvPLCSpyOutputColumns.Name).Value = dgvrJDE.Cells(dgvTagBrowserColumns.Name).Value ThendgvrTab.Cells(dgvPLCSpyOutputColumns.Name).Style.BackColor = Color.White
    10. If dgvrTab.Cells(dgvPLCSpyOutputColumns.Address).Value = dgvrJDE.Cells(dgvTagBrowserColumns.Address).Value Then
    11. If Not dgvrTab.Cells(dgvPLCSpyOutputColumns.Address).Style.BackColor = Color.Orange ThendgvrTab.Cells(dgvPLCSpyOutputColumns.Address).Style.BackColor = Color.White
    12. End IfElseIf MessageBox.Show("Value from tab is different with value from *.jde-file." & vbCrLf & vbCrLf & vbCrLf & _
    13. "Active tab:" & vbTab & vbTab & tp.Text & vbCrLf & vbCrLf & _"Value from tab:" & vbTab & vbTab & dgvrTab.Cells(dgvPLCSpyOutputColumns.Address).Value & vbCrLf & _
    14. "Value from *.jde-file:" & vbTab & dgvrJDE.Cells(dgvTagBrowserColumns.Address).Value & vbCrLf & vbCrLf & vbCrLf & _"Would you like to replace the value with value from *.jde-file?", _
    15. "Replace value", _MessageBoxButtons.YesNo, _
    16. MessageBoxIcon.Question, _
    17. MessageBoxDefaultButton.Button1) = Windows.Forms.DialogResult.Yes ThendgvrTab.Cells(dgvPLCSpyOutputColumns.Address).Value = dgvrJDE.Cells(dgvTagBrowserColumns.Address).Value
    18. dgvrTab.Cells(dgvPLCSpyOutputColumns.Address).Style.BackColor = Color.Orange
    19. End If
    20. End If
    21. Next
    22. Next
    23. NextEnd Sub



    Gruß Michael
    Wo kommen denn die Daten her?
    Aus einer DB oder einer XML-Datei? Wenn ja, dann in ein typisiertes DataSet laden und per LINQ mit Quasi-DB-Mitteln vergleichen.
    Das DGV dient hier nur der Anzeige und als Editor, mehr nicht.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo,

    @RodFromGermany: Danke für Deine Antwort. Die Daten liegen in einem DataTable und kommen aus einer XML-Datei. Das Problem ist, dass das DataTable nicht die Formatierung des DataGridView hält, oder täusche ich mich da. Aus diesem Grund jedenfalls vergleiche ich Zeilenweise die Inhalte der DGVs.

    In der Zwischenzeit habe ich eine Lösung gefunden, quasi hinten durch die Brust ins Auge:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Sub CheckAddressesBetweenTabsAndJDEFile()
    2. tcMain.SelectedTab = tcMain.TabPages(tpPLCSpy.Name)
    3. For Each tp As TabPage In tcPLCSpy.TabPages
    4. If tp.Text = tpPLCSpyPreSelection.Text Then Exit For
    5. tcPLCSpy.SelectedTab = tcPLCSpy.TabPages(tp.Name)
    6. Dim dgvTab As DataGridView = CType(tp.Controls("dgv" & tp.Text), DataGridView)
    7. For Each dgvrTab As DataGridViewRow In dgvTab.Rows
    8. dgvrTab.Cells(dgvPLCSpyOutputColumns.Name).Style.BackColor = Color.Red
    9. If Not dgvrTab.Cells(dgvPLCSpyOutputColumns.Address).Style.BackColor = Color.Orange Then
    10. dgvrTab.Cells(dgvPLCSpyOutputColumns.Address).Style.BackColor = Color.Red
    11. End If
    12. Next
    13. .
    14. .
    15. .
    16. Next
    17. End Sub


    Zeile 2 und 5 haben den Ausschlag gegeben. Dadurch, dass die TabPage ausgewählt wurde scheint das entsprechende DataGridView erst greifbar zu sein. Oder habt Ihr eine andere Erklärung?

    Gruß Michael
    Deine Philosophie ist suboptimal.
    Die DataTable hat das Primat, das DGV ist sekundär. Beim DGV musst Du gar nix vorgeben, nur per DataBinding die DataTable zuweisen, XML einlesen, fertich. Gearbeitet wird auf den Daten, also der Tabelle, nicht aber im DGV. Das zeigt nur an und nimmt Tastendrücke entgegen zum Editieren und zur Navigation.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Bei dem was Du sagst stimme ich Dir voll und ganz zu.

    Was ich allerdings mit dieser Vorgehensweise erreichen möchte ist das vergleichsabhängige und dauerhafte Einfärben der Zellen. Geht denn das bei einem DataTable auch? Ich habe bisher keine Möglichkeit darfür gesehen.



    Gruß Michael
    Nein.
    Eine DataTable sind Daten, ein DataGridView ist GUI. Wir bemühen uns halt, Daten und GUI streng voneinander zu trennen.
    Eine DGV-Zelle hat einen CellStyle, den kannst Du entsprechend editieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Michael B. schrieb:

    Was ich allerdings mit dieser Vorgehensweise erreichen möchte ist das vergleichsabhängige und dauerhafte Einfärben der Zellen.
    Dassis eher ein Job für OwnerDrawing:
    coloriertes DatagridView
    noch ein coloriertes Datagridview

    Am Cellstyle rumzufummeln ist etwas unpassend, wenns drum geht, die Anzeige von Daten Datenabhängig zu modifizieren.
    ZB machst du per CellStyle die 3. Zeile rot, und löschst dann die erste, hast du anschließend die falsche Zeile coloriert.

    OwnerDrawing hingegen hakt direkt vor dem Zeichnen ein, und egal wie die Daten sich ändern - da anschließend neu gezeichnet wird, bleibt die Darstellung ohne jede weitere Nachführung korrekt.