Datagridview Farbänderung zu langsam

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

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Rattenfänger.

    Datagridview Farbänderung zu langsam

    Hallo ich habe eine Datatabel mit einem Dataview an ein Datagridview gebunden. Jetzt sind in der Datagridview nur 20 Zeilen über ein Rowfilter sichtbar.
    Die änderunden in der Datatabel werden in einer anderen klasse mit einem Backroundworker geändert. Hier kann es sein das 2 bis 3 rows im millisekunden takt geändert werden(ich kann nicht genau sagen wie schnell).
    Wenn ich das listchangehandle deaktiviere werden die werte in realtime geändert und im DGV angezeigt. Sobald ich aber das Handle für das Listchange einschalte kommt es zu immensen zeitverzögerungen. Was mache ich falsch.

    Hier der Code der die Zeilen mit den einträgen ändert.

    VB.NET-Quellcode

    1. Private Sub ChangeOffersTable(ByVal rowData As O2GRow)
    2. Dim foundrow() As DataRow = Changingtable.Select(Changingtable.Columns(0).ColumnName & " = '" & rowData.getCell(0).ToString & "'")
    3. Dim column As O2GTableColumnCollection = rowData.Columns
    4. Dim i1 As Integer = 0
    5. Dim Changevalue As Boolean = False
    6. For Each SelectedRow As DataRow In foundrow
    7. SelectedRow.BeginEdit()
    8. If CDbl(SelectedRow(3)) <> CDbl(rowData.getCell(3)) Then
    9. SelectedRow(3) = CDbl(rowData.getCell(3))
    10. SelectedRow(28) = CDbl(rowData.getCell(28))
    11. Changevalue = True
    12. End If
    13. If CDbl(SelectedRow(4)) <> CDbl(rowData.getCell(4)) Then
    14. SelectedRow(4) = CDbl(rowData.getCell(4))
    15. SelectedRow(29) = CDbl(rowData.getCell(29))
    16. Changevalue = True
    17. End If
    18. SelectedRow(5) = CDbl(rowData.getCell(5))
    19. SelectedRow(6) = CDbl(rowData.getCell(6))
    20. SelectedRow(7) = CDbl(rowData.getCell(7))
    21. SelectedRow(11) = CDbl(rowData.getCell(11))
    22. SelectedRow(12) = CDbl(rowData.getCell(12))
    23. SelectedRow(27) = CDbl(rowData.getCell(27))
    24. SelectedRow.EndEdit()
    25. Exit For
    26. Next
    27. 'Hier wird eine andere Klasse angesprochen hier werden auch noch änderungen evtl. gemacht
    28. If Not Point_Settings Is Nothing And Changevalue = True Then
    29. If CInt(rowData.getCell(0)) <= 13 And FXCM_Connector_Int.DownloadHistoricalData = False And FXCM_Connector_Int.UpdateHistory = False Then
    30. MyMethod2 = New mymethod(AddressOf Point_Settings.ChangingOffer)
    31. MyMethod2.Invoke(rowData.getCell(1).ToString, rowData.getCell(4).ToString, rowData.getCell(3).ToString)
    32. End If
    33. End If
    34. End Sub


    Hier der Code der die farben ändert.

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports fxcore2
    3. Imports System.Threading
    4. Public Class RealTime_Kurse_Form
    5. Public WithEvents OffersDataView As New DataView
    6. Delegate Sub mymethod(ByVal Rownindex As Integer)
    7. Dim ChangeBoolean As Boolean = False
    8. Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    9. Me.DataGridView2.Columns.Clear()
    10. Me.MdiParent = TZAutoTradingTool
    11. Me.Location = New Point(-1, 170)
    12. End Sub
    13. Private Sub Form2_LocationChanged(sender As Object, e As EventArgs) Handles Me.LocationChanged
    14. Me.Location = New Point(-1, 170)
    15. End Sub
    16. Public Sub AddBinding()
    17. Try
    18. OffersDataView = TZAutoTradingTool.OffersTable.DefaultView
    19. Me.DataGridView2.DataSource = OffersDataView
    20. Catch ex As Exception
    21. End Try
    22. End Sub
    23. Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
    24. ChangeBoolean = True
    25. If CheckBox1.Checked Then
    26. OffersDataView.RowFilter = "SubscriptionStatus = 'T'"
    27. Else
    28. OffersDataView.RowFilter = ""
    29. End If
    30. ChangeBoolean = False
    31. End Sub
    32. Private Sub ListChange(ByVal sender As Object, ByVal args As System.ComponentModel.ListChangedEventArgs) Handles OffersDataView.ListChanged
    33. Dim MyMethod2 As New mymethod(AddressOf changedatagrid)
    34. Invoke(MyMethod2, args.NewIndex)
    35. End Sub
    36. Private Sub changedatagrid(ByVal Rownindex As Integer)
    37. If ChangeBoolean = False Then
    38. Dim Selectedrow As DataGridViewRow = Me.DataGridView2.Rows(Rownindex)
    39. Select Case CInt(Selectedrow.Cells("BidChangeDirection").Value)
    40. Case -1
    41. Selectedrow.Cells("BID").Style.ForeColor = Color.Red
    42. Case 1
    43. Selectedrow.Cells("BID").Style.ForeColor = Color.Green
    44. End Select
    45. Select Case CInt(Selectedrow.Cells("AskChangeDirection").Value)
    46. Case -1
    47. Selectedrow.Cells("ASK").Style.ForeColor = Color.Red
    48. Case 1
    49. Selectedrow.Cells("ASK").Style.ForeColor = Color.Green
    50. End Select
    51. Select Case CInt(Selectedrow.Cells("LowChangeDirection").Value)
    52. Case -1
    53. Selectedrow.Cells("Low").Style.ForeColor = Color.Red
    54. Case 1
    55. Selectedrow.Cells("Low").Style.ForeColor = Color.Green
    56. End Select
    57. Select Case CInt(Selectedrow.Cells("HiChangeDirection").Value)
    58. Case -1
    59. Selectedrow.Cells("High").Style.ForeColor = Color.Red
    60. Case 1
    61. Selectedrow.Cells("High").Style.ForeColor = Color.Green
    62. End Select
    63. End If
    64. End Sub
    65. End Class
    Jetzt mal unabhängig vom Code: Wenn Du weißt, dass das scharfgeschaltete Event inakzeptable Zeitverzögerungen verursacht, warum schaltest Du es dann scharf, wenn es auch ohne geht (so wie ich Deine Problembeschreibung lese)? Das ListChanged-Event ist AFAIK mit n Haufen Zusatzhintergrund-"rauschen"/-arbeit verbunden, klar, dass das verzögert.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Die änderungen sind halt besser ersichtlich. Also ist das Event / Handle immens langsam, ok das war auch meine vermutung.
    Ok dann versuche ich das mal anders :-). Danke für die Info.

    Rattenfänger schrieb:

    Hallo ich habe eine Datatabel mit einem Dataview an ein Datagridview gebunden. Jetzt sind in der Datagridview nur 20 Zeilen über ein Rowfilter sichtbar.
    Die änderunden in der Datatabel werden in einer anderen klasse mit einem Backroundworker geändert.
    Sowas geht nicht, weil da findet intern ein ungültiger threadübergreifender Zugriff statt.
    Welcher leider bei Databinding nicht vom System mit der entsprechenden Fehlermeldung quittiert wird.
    Stattdessen tritt unerwartetes Verhalten auf.

    In Databinding-Szenarien muss man die Bindings temporär lösen, wenn man die Table nebenläufig befüllen möchte.
    Und da würde der Async-Pattern malwieder seine Überlegenheit gegenüber der Backgroundworker-Krücke ausspielen können.

    Oder halt nicht nebenläufig befüllen.