Daten aus DataTable im DGV darstellen -> "Schatten" der alten Daten werden ebenfalls angezeigt

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Duke.

    Daten aus DataTable im DGV darstellen -> "Schatten" der alten Daten werden ebenfalls angezeigt

    Hi,

    ich habe hier grade was, das ich mir nicht erklären kann.
    Ich habe eine Tabelle eines typisierten Dataset per BindingSource an ein DGV gebunden.

    Ich füge in einer Schleife neue Zeilen ein. Dazu werden dann bei jedem Durchlauf die Zeilen (Spalten "Vk" und "e_sys"),
    die zu dem gleichen Prüfschritt und Block gehören aktualisiert.

    Jetzt ist es so, dass scheinbar alle vergangenen Werte von "Vk" und "e_sys" in der Spalte ebenfallls noch mit angezeigt werden.
    Je öfter ein neuer Wert reingeschrieben wird, um so unleserlicher wird der Feldinhalt der veränderten Zeilen auf dem DGV:


    Kommentiere ich die Zeilen 12-17 aus, so wird alles korrekt angezeigt.

    Quellcode

    1. rowMesswert = measureValues.tbmesswerte.NewRow()
    2. rowMesswert.Pruefung = rowPruefung.Id
    3. rowMesswert.Zeitpunkt = DateAndTime.Now()
    4. rowMesswert.Pruefschritt = aktPruefschritt
    5. rowMesswert.Block = aktBlock
    6. rowMesswert.Vk_max = pruefschritt.MessAbw_zuf_max
    7. rowMesswert.e_sys_max = pruefschritt.MessAbw_sys
    8. calculated_Vk = Berechne_Vk()
    9. calculated_e_sys = Berechne_e_sys()
    10. For Each dRow In measureValues.tbmesswerte.Where(Function(x) x.Pruefschritt = aktPruefschritt AndAlso x.Block = aktBlock)
    11. dRow.Ok = valueOk
    12. dRow.Vk = calculated_Vk
    13. dRow.e_sys = calculated_e_sys
    14. dRow.AcceptChanges()
    15. Next
    16. rowMesswert.Ok = valueOk
    17. rowMesswert.Vk = calculated_Vk
    18. rowMesswert.e_sys = calculated_e_sys
    19. measureValues.tbmesswerte.Rows.Add(rowMesswert)


    Wo liegt mein Problem ? ?(
    Bilder
    • E3-Set_2017-04-25_10-25-52.jpg

      25,78 kB, 363×169, 232 mal angesehen
    Jo, hab ich.

    Mir ist grade noch was anderes aufgefallen und deswegen habe ich
    mal die CellPainting-Routine auskommentiert (e.CellStyle.ForeColor und e.CellStyle.BackColor werden in Abhängigkeit der Daten gesetzt)

    -> jetzt scheint er die Daten korrekt anzuzeigen.

    Wieso verursacht das Setzen der Vorder- und Hintergrundfarbe während des CellPainting-Event so ein Verhalten ? :S


    EDIT: Nutzen des CellPainting sub-optimal ?

    Edit 2 : Mit dem CellFormatting-Ereignis ist das Verhalten gleich

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Duke“ ()

    Hab ich eben mal versucht (statt CellFormatting auch mal wieder CellPainting genutzt), aber dann werden die Zellen gar nicht mehr gezeichnet und bleiben komplett grau (DGV-Background) -> siehe Bild.
    (e.Handled = True habe ich nur dann gesetzt, wenn ich explizit auch ein Farbe gesetzt habe)


    Ich konnte das Problem jetzt aber umgehen, in dem ich die Daten-Werte nicht verändere und so die Werte-Historie einfach anzeige.

    Ich konnte das Problem jetzt umgehen, indem ich im Normalfall nicht grundsätzlich die BackGround-Farbe der Zelle ändere,
    sondern nur im Fehlerfall (Zeile 23 und 30 wurden dafür auskommentiert):

    VB.NET-Quellcode

    1. Private Sub dgvMeasure_CellFormatting(sender As Object, e As DataGridViewCellFormattingEventArgs) Handles dgvMeasure.CellFormatting
    2. ...
    3. Select Case e.ColumnIndex
    4. Case BlockDataGridViewTextBoxColumn.Index
    5. ' 0=nicht ok, 1=ok, 2=nicht definiert
    6. Select Case currentRow.Cells(OkDataGridViewCheckBoxColumn.Index).Value
    7. Case 0
    8. e.CellStyle.BackColor = Color.LightCoral
    9. Case 1
    10. ' 1= ok
    11. e.CellStyle.BackColor = Color.LightGreen
    12. Case 2
    13. ' 2= noch nicht klar
    14. e.CellStyle.BackColor = Color.Khaki
    15. End Select
    16. Case EsysDataGridViewTextBoxColumn.Index
    17. If currentRow.Cells(EsysDataGridViewTextBoxColumn.Index).Value > currentRow.Cells(EsysmaxDataGridViewTextBoxColumn.Index).Value Then
    18. e.CellStyle.BackColor = Color.LightCoral
    19. Else
    20. 'e.CellStyle.BackColor = currentRow.DefaultCellStyle.BackColor
    21. End If
    22. Case VkDataGridViewTextBoxColumn.Index
    23. If currentRow.Cells(VkDataGridViewTextBoxColumn.Index).Value > currentRow.Cells(VkmaxDataGridViewTextBoxColumn.Index).Value Then
    24. e.CellStyle.BackColor = Color.LightCoral
    25. Else
    26. 'e.CellStyle.BackColor = currentRow.DefaultCellStyle.BackColor
    27. End If
    28. End Select
    29. ...
    30. End Sub

    Bilder
    • E3-Set_2017-04-26_07-58-47.jpg

      74,45 kB, 385×277, 91 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Duke“ ()