Multi-Select in Datagridview nur in einer Zeile erlauben

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Murdoc.

    Multi-Select in Datagridview nur in einer Zeile erlauben

    Hallo,

    ich versuche bisher vergeblich, es so zu ermöglichen das der User zwar mehrere einzelen Zellen (nicht ganze Zeilen) markieren kann,
    das aber immer nur in einer Zeile darf.

    Außerdem habe ich das Problem, das die Abfolge der Zellen je nach Selecktierreihenfolge in der For each unterschiedlich ist. Bei der Abarbeitung der Zellen in der For Each bräuchte ich die Zellen aber aufsteigend nach ColumnIndex.

    Weiß jemand einen Weg? Danke!

    Mfg
    Gruß Murdoc

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

    Hm, m.E. n icht ganz so einfach. Wenn Du es verbietest, dass man über das Anklicken der Spaltenköpfe alle Zellen einer Spalte gleichzeitig anwählen kann, sollte es gehen: Über das SelectionChanged-Ereignis kannst Du arbeiten. Wenn bisher erst eine Zelle selektiert wurde, speicherst Du deren RowIndex in einer Klassenvariable ab. Danach kannst Du alle selektierten Zellen durchgehen und prüfen, welchen RowIndex diese haben. Ist der RowIndex anders als der (derzeit) erlaubte, kannst Du mit .Selected = False diese Zellen deselektieren. Und wenn gar nichts mehr selektiert ist, setzt Du den Wert der Klassenvariable auf einen default-Wert, z.B. -1, sodass immer gefrüft werden kann, ob ein Sollzeilenwert schon feststeht.
    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.
    Dass da mehrere selektiert werden sollen, ist mir klar. Es ging mir nur darum, dass die erste Zelle, die man selektiert, die Zeilennummer festlegt, die erlaubt ist und dass alle danach selektierten Zellen jenen Zeilenindex aufweisen müssen, ansonsten werden sie delesektiert.

    Murdoc schrieb:

    den niedrigsten rowindex
    Hm, wenn das so gewollt ist. Nicht, dass der User 5 Zellen in Zeile 2 selektiert, er dann versehentlich auf eine Zelle in Zeile 1 klickt und dadurch alle Zellen in Zeile 2 deselektiert werden.
    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.

    VB.NET-Quellcode

    1. Private Sub DataGridView1_SelectionChanged(sender As Object, e As EventArgs) Handles DataGridView1.SelectionChanged
    2. Static RowIndexThatMustBe As Integer = -1
    3. If DataGridView1.SelectedCells.Count = 0 Then
    4. RowIndexThatMustBe = -1
    5. ElseIf DataGridView1.SelectedCells.Count = 1 Then
    6. RowIndexThatMustBe = DataGridView1.SelectedCells(0).RowIndex
    7. Else
    8. For Each Cell As DataGridViewCell In DataGridView1.SelectedCells
    9. If Cell.RowIndex <> RowIndexThatMustBe Then Cell.Selected = False
    10. Next
    11. End If
    12. End Sub

    läuft
    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.
    PERFEKT! Vielen Dank.

    Zu meinem Sortierungsproblem habe ich jetzt selbst eine Lösung gefunden:

    Quellcode

    1. Private Sub IterateSortedCells
    2. Dim selcells As New List(Of DataGridViewCell)
    3. Dim iLowestRowIndex As Integer = dgv_Planung.SelectedCells(0).RowIndex
    4. For Each cll As DataGridViewCell In dgv_Planung.SelectedCells
    5. If cll.RowIndex < iLowestRowIndex Then iLowestRowIndex = cll.RowIndex
    6. Next cll
    7. For Each cll As DataGridViewCell In dgv_Planung.SelectedCells
    8. If cll.RowIndex > iLowestRowIndex Then
    9. cll.Selected = False
    10. Else
    11. selcells.Add(cll)
    12. End If
    13. Next cll
    14. selcells.Sort(Function(x, y) x.ColumnIndex.CompareTo(y.ColumnIndex))
    15. For Each cll As DataGridViewCell In selcells
    16. .
    17. .
    18. Next

    Gruß Murdoc