mal wieder DataGridView (Anklicken einer Auswahlcheckbox)

  • VB.NET

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von jan99.

    mal wieder DataGridView (Anklicken einer Auswahlcheckbox)

    Moin!

    ich habe einmal wieder ein Problem mit einer Auswahlbox bei DataGridviews.

    Es soll mitgezählt werden wieviele Einträge gewählt wurden. Dazu gibt es folgenden Code:

    VB.NET-Quellcode

    1. Imports System.Windows.Forms
    2. Imports System.Data.OracleClient
    3. Public Class frm_GrdStkInfoUmzug
    4. Public _FID_GstSource As Long = -1
    5. Public _FID_GstTarget As Long = -1
    6. Public _TotalCountRecord As Integer = 0 'Gesamtzahl der Datensätze
    7. Public _TotalCountRecordSelected As Integer = 0 'Anzahl der gewählten Datensätze
    8. Public Event DataError As DataGridViewDataErrorEventHandler
    9. ''' <summary>
    10. ''' Abfangen von Fehlern in der Befüllung - Projekt
    11. ''' </summary>
    12. Private Sub DataGridView_DataError(ByVal sender As Object, _
    13. ByVal e As DataGridViewDataErrorEventArgs) _
    14. Handles DataGridView.DataError
    15. MessageBox.Show("Fehler aufgetreten " _
    16. & e.Context.ToString())
    17. If (e.Context = DataGridViewDataErrorContexts.Commit) _
    18. Then
    19. MessageBox.Show("Fehler übergeben (commit)")
    20. End If
    21. If (e.Context = DataGridViewDataErrorContexts _
    22. .CurrentCellChange) Then
    23. MessageBox.Show("Zell wechsel")
    24. End If
    25. If (e.Context = DataGridViewDataErrorContexts.Parsing) _
    26. Then
    27. MessageBox.Show("Parsing-Fehler")
    28. End If
    29. If (e.Context = _
    30. DataGridViewDataErrorContexts.LeaveControl) Then
    31. MessageBox.Show("Fehler beim Verlassen des Steuerelementes")
    32. End If
    33. If (TypeOf (e.Exception) Is ConstraintException) Then
    34. Dim view As DataGridView = CType(sender, DataGridView)
    35. view.Rows(e.RowIndex).ErrorText = "ein Fehler"
    36. view.Rows(e.RowIndex).Cells(e.ColumnIndex) _
    37. .ErrorText = "ein Fehler"
    38. e.ThrowException = False
    39. End If
    40. End Sub
    41. ''' <summary>
    42. ''' Überwachen der Spalte mit den Auswahlhaken
    43. ''' </summary>
    44. Public Sub DataGridView_SelectionColumnControlling(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles DataGridView.CellValueChanged
    45. Dim DVGRow As DataGridViewRow
    46. For Each DVGRow In DataGridView.Rows
    47. If CType(DVGRow.Cells(0).Value, Boolean) = True Then
    48. _TotalCountRecordSelected = _TotalCountRecordSelected + 1
    49. VisibleControlButtonDo()
    50. Exit Sub
    51. Else
    52. _TotalCountRecordSelected = _TotalCountRecordSelected - 1
    53. VisibleControlButtonDo()
    54. Exit Sub
    55. End If
    56. Next
    57. End Sub
    58. ''' <summary>
    59. ''' Überwachung der Schaltfläche für die "Verschieben"-Schaltfläche
    60. ''' </summary>
    61. ''' <remarks></remarks>
    62. Private Sub VisibleControlButtonDo()
    63. If _TotalCountRecordSelected = 0 Then
    64. bt_do.Enabled = False
    65. Else
    66. bt_do.Enabled = True
    67. End If
    68. End Sub
    69. ''' <summary>
    70. ''' Hilfeanbindung
    71. ''' </summary>
    72. Private Sub bt_help_Click(sender As Object, e As EventArgs) Handles bt_help.Click
    73. Process.Start("http://ma22-wiki-001/eblwiki/index.php?title=3.65_Spezialfunktionen_(MapEdit-Handbuch)#Historie_importieren")
    74. End Sub
    75. ''' <summary>
    76. ''' Alle Zeilen der Punktliste markieren
    77. ''' </summary>
    78. ''' <param name="sender"></param>
    79. ''' <param name="e"></param>
    80. ''' <remarks></remarks>
    81. Private Sub bt_AlleWählen_Click(sender As Object, e As EventArgs) Handles bt_AlleWählen.Click
    82. StatusGesamtAuswahlÄndern(True)
    83. _TotalCountRecordSelected = _TotalCountRecord
    84. VisibleControlButtonDo()
    85. End Sub
    86. ''' <summary>
    87. ''' Alle Zeilen der Punktliste DEmarkieren
    88. ''' </summary>
    89. ''' <param name="sender"></param>
    90. ''' <param name="e"></param>
    91. ''' <remarks></remarks>
    92. Private Sub bt_KeineWählen_Click(sender As Object, e As EventArgs) Handles bt_KeineWählen.Click
    93. StatusGesamtAuswahlÄndern(False)
    94. _TotalCountRecordSelected = 0
    95. VisibleControlButtonDo()
    96. End Sub
    97. ''' <summary>
    98. ''' Setzen von Auswahlhaken
    99. ''' </summary>
    100. Private Sub StatusGesamtAuswahlÄndern(ByVal Status As Boolean)
    101. Dim DVGRow As DataGridViewRow
    102. For Each DVGRow In DataGridView.Rows
    103. DVGRow.Cells(0).Value = Status
    104. Next
    105. bt_do.Enabled = Status
    106. End Sub
    107. End Class


    Nach meiner Auffassung müsste immer, wenn ein Haken in der Spalte 0 gesetzt bzw. entfernt wird die Funktion

    VB.NET-Quellcode

    1. Public Sub DataGridView_SelectionColumnControlling(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles DataGridView.CellValueChanged


    aufgerufen werden. Wird es aber nicht - meist nach dem 2. erst.

    Kann mir einer weiterhelfen?

    Gruß Jan
    @jan99 Das scheint tricky zu sein. Schau mal hier rein: docs.microsoft.com/de-de/dotne…ged?view=netframework-4.8
    da wirst Du auf das DataGridView.CurrentCellDirtyStateChanged-Event verwiesen:
    docs.microsoft.com/de-de/dotne…ged?view=netframework-4.8
    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!
    Moin!

    erst einmal danke. Habe die Funktion jetzt auf DataGridView.CurrentCellDirtyStateChanged umgestellt.

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Überwachen der Spalte mit den Auswahlhaken
    3. ''' </summary>
    4. Public Sub DataGridView_SelectionColumnControlling(ByVal sender As Object, ByVal e As EventArgs) Handles DataGridView.CurrentCellDirtyStateChanged
    5. Dim DVGRow As DataGridViewRow
    6. For Each DVGRow In DataGridView.Rows
    7. If CType(DVGRow.Cells(0).Value, Boolean) = True Then
    8. _TotalCountRecordSelected = _TotalCountRecordSelected + 1
    9. VisibleControlButtonDo()
    10. Exit Sub
    11. Else
    12. _TotalCountRecordSelected = _TotalCountRecordSelected - 1
    13. VisibleControlButtonDo()
    14. Exit Sub
    15. End If
    16. Next
    17. End Sub


    Aber so ganz richtig arbeitet das auch nicht. Es wird zwar auf ein Click-Event reagiert. Wird aber dieselbe Zelle mehrfach hintereinander angeklickt, dann kommt es zu keine Eventauslösung.

    Gruß Jan


    Ich habe die Funktion noch etwas modifiziert:

    VB.NET-Quellcode

    1. Public Sub DataGridView_SelectionColumnControlling(ByVal sender As Object, ByVal e As EventArgs) Handles DataGridView.CurrentCellDirtyStateChanged
    2. Dim DVGRow As DataGridViewRow
    3. _TotalCountRecordSelected = 0
    4. For Each DVGRow In DataGridView.Rows
    5. If CType(DVGRow.Cells(0).Value, Boolean) = True Then
    6. _TotalCountRecordSelected += 1
    7. End If
    8. Next
    9. VisibleControlButtonDo()
    10. End Sub


    Jetzt wollte ich einfach die Anzahl der gehakten Checkboxen durchzählen.

    Merkwürdigerweise wird aber trotz anhaken der Schaltfläche ein Value=False ausgegeben!

    Abgesehen davon, dass nicht auf jeden Zell-Klick das Event, wie oben geschrieben, ausgelöst wird.

    Gruß Jan


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