DGV markierte Zellen mitels Button Klick verschieben

  • VB.NET
  • .NET (FX) 3.0–3.5

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

    DGV markierte Zellen mitels Button Klick verschieben

    Hallo
    Ich versuche gerade eine Funktion zu bauen, mit der ich ausgewählten Zellen eines DGV, mithilfe von 4 Buttons (hoch, runter, links, rechts) entsprechend verschieben kann.
    Also ich wähle eine beliebige Menge Zellen im DGV aus und nach Klick auf den Button links, sollen alle ausgewählten Zellen eins nach links wandern.

    Meine Überlegug hierzu ist, auszulesen welche Zellen (also Row- und Columnindex) überhaupt angeklickt sind und den Row. - bzw. ColumnIndex entsprechend der Richtung (oben unten links rechts) zu ändern.
    Allerdings scheitere ich daran.

    VB.NET-Quellcode

    1. Private Sub BTNLeft_Click(sender As Object, e As EventArgs) Handles BTNLeft.Click
    2. If DataGridView1.SelectedCells.Count = 0 Then Exit Sub
    3. 'Ansatz 1
    4. Dim selectedCells = DataGridView1.SelectedCells
    5. Dim rowindex As Integer
    6. Dim colindex As Integer
    7. For Each cell In selectedCells
    8. rowindex = cell.rowindex 'für die einzelnen Cells gibt's keine Row oder Column Eigenschaft
    9. Next
    10. 'Ansatz 2
    11. Dim col = DataGridView1.CurrentCell.ColumnIndex
    12. Dim row = DataGridView1.CurrentCell.RowIndex
    13. 'die beiden Eigenschaften beziehen sich immer nur auf eine Zelle
    14. MessageBox.Show(col.ToString & " " & row.ToString)
    15. End Sub

    Ansatz 1 liefert mir zwar mittels messagebox.show(cell.tostring) die korrekten Row und Column Indexes, allerdings kann ich codetechnisch nicht darauf zu greifen.
    Ansatz 2 liefert mir leider immer nur Col und Row Index einer Zelle (nicht der Selection).
    Wie gehe ich hier am besten ran?

    Wer mag, findet Demo natürlich im Anhang.
    Dateien
    • DGVTest.zip

      (36,34 kB, 71 mal heruntergeladen, zuletzt: )
    @DerSmurf Du musst natürlich alle Richtungen einzeln behandeln:
    • bei Nach Oben musst Du von oben nach unten gehen,
    • bei Nach Unten musst Du von unten nach oben gehen,
    • bei Nach Linls musst Du von links nach rechts gehen,
    • bei Nach Rechts musst Du von rechts nach links gehen.
    Gehe also alle Zellen einzeln per Row und Column durch und frage, ob sie zur Selected-Collection gehört.
    Wenn ja, bewege den Inhalt und lösch die Herkunftszelle.
    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!

    RodFromGermany schrieb:

    Gehe also alle Zellen einzeln per Row und Column durch und frage, ob sie zur Selected-Collection gehört.

    Wie denn?
    Das wäre ja mein Ansatz Nummer 1.
    Aber wie lese ich in meinem Ansatz 1 aus "cells" die row und Column aus?
    @DerSmurf Nicht mit For Each sondern mit 4 doppelten For-Schleifen (hier nur eine):

    VB.NET-Quellcode

    1. For row = 0 To DGV.Rows.Count
    2. For col = 0 To DGV.Columns.Count
    3. 'DGV(row, col) ' oder so ähnlich
    4. Next
    5. Next

    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!
    Na. So gehe ich das komplette DGV durch.
    Also reihenweise jede Spalte.
    Aber ich scheitere daran, herauszufinden, welche Zellen ANGEKLICKT sind.

    Edit:
    oder meinst du das so?

    VB.NET-Quellcode

    1. Private Sub BTNLeft_Click(sender As Object, e As EventArgs) Handles BTNLeft.Click
    2. For row = 0 To DataGridView1.Rows.Count - 1
    3. For col = 0 To DataGridView1.Columns.Count - 1
    4. If DataGridView1(col, row).Selected Then
    5. DataGridView1(col - 1, row).Value = DataGridView1(col, row).Value
    6. DataGridView1(col, row).Value = Nothing
    7. End If
    8. Next
    9. Next
    10. End Sub


    Hab dein Beispiel abgewandelt. Schleifen bis count - 1, weil ja 0 basiert.
    Und in deiner anweisung DGV(row, col) sind row und col falsch herum.

    So funktionierts. Vielen Dank :o)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „DerSmurf“ ()

    DerSmurf schrieb:

    falsch herum.
    Weil ich das nicht auswendig wusste, steht da:

    RodFromGermany schrieb:

    VB.NET-Quellcode

    1. ' oder so ähnlich
    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!