Datagridview Drag&Drop, Clear Content, ...

  • VB.NET

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

    Datagridview Drag&Drop, Clear Content, ...

    Edit by ErfinderDesRades: (Thema verschoben) Bitte richtiges UnterForum wählen!

    Hallo Community,

    ich habe gleich mehrere Fragen und würde diese auch alle hier in einen Thread packen:

    1. Meine zurecht geschnipselte Drag&Drop Funktion sieht im Moment so aus (funktioniert):

    Spoiler anzeigen

    VB.NET-Quellcode

    1. '***Drag and Drop Cell Content***
    2. Private Sub SDGV_MouseDown(sender As Object, e As MouseEventArgs) Handles SDGV.MouseDown
    3. If chkboxdgdp.Checked Then
    4. Dim info As DataGridView.HitTestInfo = Me.SDGV.HitTest(e.X, e.Y)
    5. If info.RowIndex <> -1 AndAlso info.ColumnIndex <> -1 Then
    6. Dim value As [Object] = Me.SDGV.Rows(info.RowIndex).Cells(info.ColumnIndex).Value
    7. If value IsNot Nothing Then
    8. Me.SDGV.Rows(info.RowIndex).Cells(info.ColumnIndex).Value = Nothing
    9. Me.DoDragDrop(value, DragDropEffects.Move)
    10. End If
    11. End If
    12. End If
    13. End Sub
    14. Private Sub SDGV_DragDrop(sender As Object, e As DragEventArgs) Handles SDGV.DragDrop
    15. Dim p As Point = Me.SDGV.PointToClient(New Point(e.X, e.Y))
    16. Dim info As DataGridView.HitTestInfo = Me.SDGV.HitTest(p.X, p.Y)
    17. If info.RowIndex <> -1 AndAlso info.ColumnIndex <> -1 Then
    18. Dim value As [Object] = DirectCast(e.Data.GetData(GetType(String)), [Object])
    19. Me.SDGV.Rows(info.RowIndex).Cells(info.ColumnIndex).Value = value
    20. End If
    21. End Sub
    22. Private Sub SDGV_DragEnter(sender As Object, e As DragEventArgs) Handles SDGV.DragEnter
    23. e.Effect = DragDropEffects.Move
    24. End Sub
    25. '**********************************************



    Das geht aber nur mit einer Zelle. Gibt es eine Möglichkeit, dies für (mehrere) selektierte Zellen zu tun? - Es werden nur vertikal Zellen ausgewählt. Also nur in einer Column.
    Hier würde mir ein Ansatz helfen, wo ich den Hebel ansetzen muss.

    1.1 (Ist mir gerade eingefallen) Wer sich den Code von Drag&Drop anschaut, der wird eine Checkbox bei "MouseDown" bemerken.
    Es ist im Moment nicht möglich, Drag&Drop sowie das selektieren der Zellen oder löschen des Inhalts gleichzeitig zu realisieren. Würde das nur so gehen?

    2. Das hängt ein bisschen mit den selektierten Zellen zusammen... - Momentan lösche ich den Inhalt(Content) aus einer "slektierten" Zelle so:

    VB.NET-Quellcode

    1. SDGV.CurrentCell.Value = ""


    Funktioniert. Aber eben nur für die eine Zelle. Wie muss ich die Schleife bauen, um alle selektierten Zellen anzusprechen?

    3. Gibt es eine Möglichkeit, die Zellen, welche Inhalt haben, zu Colorieren? (Mein DGV wird nur an bestimmten Stellen gefüllt.)
    Wie müsste ich die Funktion aufbauen, um diese anzusprechen?
    Bzw. Nebenfrage: Kann man Farben speichern? - Das würde doch nur mit GDI gehen, oder?

    4. Dazu habe ich auch hier schon etwas im Forum gelesen bezüglich Datengebundenem Dataset.
    Es ist ja nicht Möglich, zur Laufzeit Spalten hinzu zufügen. Wäre es da sauber, eine bestimmte Anzahl von Spalten zu erstellen, und dann nur diese zu benennen/benutzen, welche auch gebraucht werden?
    Es würden sozusagen ein paar übrig bleiben, welche später, wenn gebraucht, auch benutzt werden. Oder sollte die Struktur der DB komplett klar sein?

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

    zum DragnDrop mit Mehrfach-Selektion: DGV verhält sich da total blöd, weils die Mehrfach-Selection bereits im MouseDown aufhebt, sodasse beim Drag-Start scho weg ist.
    Workaround: bei jedem SelectionChanged die vorherige Selektion merken. Im Drag-Fall sie dann halt wiederherstellen.

    Dassis übrigens alles, was du dir merken mußt beim Draggen: nur den Selektions-Zustand des DGVs zum Zeitpunkt des Drag-Starts.
    Beim Droppen ist das DGV ja verfügbar, und dann kann dort der Selektions-Zustand ausgewertet werden, und iwas damit angefangen.

    ErfinderDesRades schrieb:


    Workaround: bei jedem SelectionChanged die vorherige Selektion merken. Im Drag-Fall sie dann halt wiederherstellen.


    Wie könnte das in etwas aussehen?

    Den Content lösche ich ja über das Mouse_Click Event - wie kann ich dort alle selektierten Zellen zusammenfassen? Bzw.Durchlaufen?

    Damit wäre dann Frage 1 und fast 2 abgearbeitet und es bleiben noch Frage 3 und 4 offen.

    klyer schrieb:

    bei jedem SelectionChanged die vorherige Selektion merken.
    ist unglücklich ausgedrückt. Also im SelectionChanged die neue Selection merken, sodass sie im DragStart wiederhergestellt werden kann.
    mach halt eine List(Of DatagridviewCell) und tu da die selektierten Zellen rein - was sonst?

    ErfinderDesRades schrieb:

    mach halt eine List(Of DatagridviewCell) und tu da die selektierten Zellen rein


    Genau sowas. Das reicht mir schon. Danke.

    -----------------------------

    Könnte sich vl. noch jm. um die anderen Fragen bemühen? ... mir reicht ja nur ein Ansatz so wie es EDR getan hat.


    2. Hat sich erledigt.
    Folgender Code löscht alle selektierten Zellen:

    VB.NET-Quellcode

    1. '// Clear all SelectedCells.
    2. For Each cell As DataGridViewCell In Datagridview1.SelectedCells : cell.Value = Nothing : Next

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

    Zu 3. (Doppelpost, da ich dies eher als Antwort sehe)

    Ich bin einfach alle Zellen im DGV durchgegangen und frage verschiedene Inhalte so ab:

    VB.NET-Quellcode

    1. If value.StartsWith("xyz") Then
    2. Datagridview1.Rows(i).Cells(j).Style.BackColor = Color.SandyBrown
    3. ElseIf value.StartsWith("zyx") Then
    4. SDGV.Rows(i).Cells(j).Style.BackColor = Color.Salmon
    5. Else
    6. SDGV.Rows(i).Cells(j).Style.BackColor = Color.Pink
    7. End If


    Eigentlich rel. einfach (Anfänger halt). Beachtet werden muss auch, dass erst einmal die Zellen herausgesucht werden, welche auch Inhalt haben.
    Statt "StartsWith" kann auch "If value.text = "xyz" then ..." geschrieben werden.
    Viel Spaß beim rumprobieren und wer Verbesserungsvorschläge hat, der kann sie gerne zeigen.

    4. Würde ich nun auch als Erledigt markieren. Wie ich es mir schon denke, müsste man eine bestimmte Anzahl an Spalten vorgeben, welche dann je nach Gebrauch mit eingebunden werden.

    Folgender Link zeigt, wie Spalten ein- oder ausgeblendet werden können (C#):
    CodeProjekt

    Damit hat sich dieser Thread wie von selber Gelöst.