DataGridView Selected Row wird zwar angezeigt, ist aber nicht selected

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

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    DataGridView Selected Row wird zwar angezeigt, ist aber nicht selected

    Hallo zusammen.

    Ich hab mir ne kleine Extension gebaut, welche mir ein Datum in einem DataGridView sucht und mir die entsprechende Zeile markiert:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. ''' <summary> zeigt einen Dialog zur Datumseingabe an. Ist DialogResult.OK wird im DGV nach dem Datum gesucht und die gefundene Row markiert </summary>
    2. <Extension>
    3. Public Sub GeheZuDatum(dgv As DataGridView)
    4. Using dlg As New dlgDateInput
    5. If dlg.ShowDialog() = DialogResult.OK Then dgv.GeheZuDatum(dlg.dtbDate.Text)
    6. End Using
    7. End Sub
    8. ''' <summary> sucht im DGV in der Spalte "Datum" nach dem Datum aus dlgDateInput. Wenn gefunden, wird die entsprechende Row markiert </summary>
    9. <Extension>
    10. Public Sub GeheZuDatum(dgv As DataGridView, Datum As String)
    11. Dim colDatum = 0
    12. For iCol = 0 To dgv.Columns.Count - 1
    13. If dgv.Columns(iCol).HeaderText = "Datum" Then
    14. colDatum = iCol
    15. Exit For
    16. End If
    17. Next
    18. For i = 0 To dgv.Rows.Count - 1
    19. If dgv.Rows(i).Cells(colDatum).FormattedValue.ToString = Datum Then
    20. dgv.FirstDisplayedScrollingRowIndex = i
    21. dgv.Rows(i).Selected = True
    22. Exit For
    23. End If
    24. Next
    25. End Sub


    Jetzt hab ich ein DataGridView mit 365 Einträgen (01.01.-31.12.). Das Datum wird korrekt gefunden und die Zeile auch selektiert. Nutze ich danach aber die Pfeiltaste "runter", selektiert er den 02.01. anstatt den 12.07. - also ist die Selection irgendwie keine Richtige.
    Bug? Feature? Gibt's Abhilfe?
    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Jou, Du musst nicht nur die SelectedCell/-Row setzen, sondern auch die CurrentCell. Die ist Dein Ansprechpartner. Selected ist nur markiert. CurrentCell ist die mit dem Eingabefokus.
    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.

    VaporiZed schrieb:

    CurrentCell ist die mit dem Eingabefokus.

    Danke, nu klappt's. Hab den Code ergänzt -> Zeile 15. Welche Zelle current ist spielt ja keine Rolle, Hauptsache die gehört zur Row.

    VB.NET-Quellcode

    1. ''' <summary> sucht im DGV in der Spalte "Datum" nach dem Datum aus dlgDateInput. Wenn gefunden, wird die entsprechende Row markiert </summary>
    2. <Extension>
    3. Public Sub GeheZuDatum(dgv As DataGridView, Datum As String)
    4. Dim colDatum = 0
    5. For iCol = 0 To dgv.Columns.Count - 1
    6. If dgv.Columns(iCol).HeaderText = "Datum" Then
    7. colDatum = iCol
    8. Exit For
    9. End If
    10. Next
    11. For i = 0 To dgv.Rows.Count - 1
    12. If dgv.Rows(i).Cells(colDatum).FormattedValue.ToString = Datum Then
    13. dgv.FirstDisplayedScrollingRowIndex = i
    14. dgv.Rows(i).Selected = True
    15. dgv.CurrentCell = dgv.Rows(i).Cells(0)
    16. Exit For
    17. End If
    18. Next
    19. End Sub


    Edit: Arbeitet man gerne bzw. generell eher mit With, anstatt jede Zeile neu mit dem Objekt zu bestücken? Der Code könnte ja auch so aussehen: (Zeile 13-17)

    VB.NET-Quellcode

    1. ''' <summary> sucht im DGV in der Spalte "Datum" nach dem Datum aus dlgDateInput. Wenn gefunden, wird die entsprechende Row markiert </summary>
    2. <Extension>
    3. Public Sub GeheZuDatum(dgv As DataGridView, Datum As String)
    4. Dim colDatum = 0
    5. For iCol = 0 To dgv.Columns.Count - 1
    6. If dgv.Columns(iCol).HeaderText = "Datum" Then
    7. colDatum = iCol
    8. Exit For
    9. End If
    10. Next
    11. For i = 0 To dgv.Rows.Count - 1
    12. If dgv.Rows(i).Cells(colDatum).FormattedValue.ToString = Datum Then
    13. With dgv
    14. .FirstDisplayedScrollingRowIndex = If(i - 7 >= 0, i - 7, i)
    15. .Rows(i).Selected = True
    16. .CurrentCell = dgv.Rows(i).Cells(0)
    17. End With
    18. Exit For
    19. End If
    20. Next
    21. End Sub


    Ist das sauberer / schöner? Oder am Ende je nach Menge nur ein bisschen weniger Schreibarbeit?

    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Nä, ich mag With nicht, weil man beim Debuggen nicht direkt reinschauen kann, welchen Wert jetzt eine Objekteigenschaft hat. So muss ich immer zum Komplettobjekt gehen und nach der Eigenschaft suchen/scrollen.
    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.
    Abgesehen vom schon erwähnten erschwerten Debuggen, finde ich es auch nicht besonders übersichtlich, wenn ich immer nachschauen muss, welches Objekt gerade im With-Block steht.
    Selbst wenn das Objekt kompliziert adressiert ist, packe ich es lieber in eine Variable als in einen With-Block.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --