Dragging von Datagridview auf Toolstrip

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

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von HalliHallo.

    Dragging von Datagridview auf Toolstrip

    Hallo erstmal,
    ich arbeite mit VisualStudio Professional 2015, Net Framework 4.6.01055 unter WIN 7 Professional
    Ich teste gerade DragDrop in einer MDI Anwendung mit Child Formularen.

    Das Draggen von einem Child-Formular zum anderen funktioniert problemlos, egal ob DataGridView oder Textboxen als Ziel oder Quelle dienen.
    Jetzt will ich aus einem DataGridView im Child-Form auf einen Toolstrip-Butten im MDI-Form draggen.
    Kann ich machen was ich will, geht nicht.... keine Reaktion.

    Im Child Form wird der Drag Vorgang so gestartet:

    VB.NET-Quellcode

    1. Private Sub DataGridView1_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs) Handles DataGridView1.MouseMove
    2. DataGridView1.DoDragDrop("Quelle", DragDropEffects.Copy)
    3. End Sub


    Für die Toolstip-Butten, die das Draggen "empfangen" sollen habe ich folgende Sub's geschrieben:

    VB.NET-Quellcode

    1. Private Sub ToolStripButton5_DragEnter(sender As Object, e As DragEventArgs) Handles ToolStripButton5.DragEnter
    2. Dim txt As String = CType(e.Data.GetData(GetType(System.String)), System.String)
    3. If txt <> "Quelle" Then
    4. e.Effect = DragDropEffects.None
    5. Else
    6. e.Effect = DragDropEffects.All
    7. End If
    8. 'Diese Sub wird aufgerufen und auch der txt ausgewertet. Aber der
    9. 'Mauscursor bleibt auf "Verboten" obwohl "e.Effect =
    10. 'DragDropEffects.All" ausgeführt wird.
    11. End Sub


    VB.NET-Quellcode

    1. Private Sub ToolStripButton5_DragDrop(sender As Object, e As DragEventArgs) Handles ToolStripButton5.DragDrop
    2. Dim txt As String = CType(e.Data.GetData(GetType(System.String)), System.String)
    3. If txt <> "Quelle" Then
    4. e.Effect = DragDropEffects.None
    5. else
    6. e.Effect = DragDropEffects.All
    7. end if
    8. 'Diese Sub wird nicht aufgerufen
    9. End Sub


    Für das Toolstrip habe ich in den Eigenschaften AllowDrop auf True gestellt.

    Bei den Buttons fehlt in der IDE bei den Eigenschaften "AllowDrop" (warum eigentlich?) Also habe ich sie im Shown - Ereignis auf True gesetzt:

    VB.NET-Quellcode

    1. Private Sub FormMain_Shown(sender As Object, e As EventArgs) Handles Me.Shown
    2. ToolStripDropDownButton1.AllowDrop = True
    3. ToolStripButton5.AllowDrop = True
    4. End Sub


    Ich hoffe, ich habe mich verständlich ausgedrückt und jemand kann mir helfen
    Vielen Dank schonmal

    Gregor
    Ich weiß jetzt zwar nicht, wo Du Deine ToolStripButtons hast, aber ich habe sie in einem ToolStrip. Und bei mir wird nur die ToolStrip_DragEnter-Prozedur erreicht (inkl. Mauscursor "Kopier-Ziel gefunden"), jedoch nicht die des ToolStrip-Buttons.

    EDIT: Ehm. Off-Topic. Aber für alle anderen, die das lesen: Da ich für Tests gerne die Stop-Anweisung verwende, habe ich gerade mitbekommen, dass ich innerhalb einer Formularklasse zwischen den Prozeduren einfach Stop schreiben kann, ohne dass der Compiler meckert. Was'n das für'n Quark? Gibt's da n Sinn dafür? Also, nicht dafür, dass ich sowas mache, sondern, dass man das Stop-Keyword zwischen Prozeduren schreiben kann.
    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.

    HalliHallo schrieb:

    Bei den Buttons fehlt in der IDE bei den Eigenschaften "AllowDrop" (warum eigentlich?)
    Das die Property versteckt wird könnte ein Hinweis darauf sein, dass ToolStripDropDownButtons als DropTarget nicht vorgesehen sind.
    Sicher bin ich nicht, müsste selbst probieren.
    Magst du eine Testanwendung anhängen?
    Falls du die Anhänge-Funktion nicht kennst:
    Ach ja, wollte ich auch noch nachsehen. Im MSDN-Artikel gab's dann die Antwort:

    MSDN schrieb:


    ToolStripItem.AllowDrop-Eigenschaft
    [...]
    Gets or sets a value indicating whether drag-and-drop and item reordering are handled through events that you implement.

    Also geht es bei den Kandidaten um ein Spezial-DnD.

    Für normales DnD muss wohl nochwas eingeschaltet werden:
    "Set the AllowDrop property to true and set the AllowItemReorder property to false to respond to drag-and-drop behavior you have defined in the ToolStripItem.DragEnter, ToolStripItem.DragLeave, and ToolStripItem.DragDrop events."

    EDIT: Ich ziehe den Kommentar zurück und biete eine Lösung: Der ToolStrip muss auch die DnD-Effekte richtig setzen bzw. das DnD erlauben:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim ok As Boolean = False
    2. Private Sub DataGridView1_MouseDown(sender As Object, e As MouseEventArgs) Handles DataGridView1.MouseDown
    3. ok = True
    4. End Sub
    5. Private Sub DataGridView1_MouseMove(sender As Object, e As MouseEventArgs) Handles DataGridView1.MouseMove
    6. If ok Then DataGridView1.DoDragDrop("Quelle", DragDropEffects.Copy)
    7. End Sub
    8. Private Sub ToolStripButton1_DragEnter(sender As Object, e As DragEventArgs) Handles ToolStripButton1.DragEnter
    9. e.Effect = DragDropEffects.All
    10. End Sub
    11. Private Sub FrmMain_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    12. ToolStripButton1.AllowDrop = True
    13. ToolStrip1.AllowDrop = True
    14. End Sub
    15. Private Sub ToolStrip1_DragEnter(sender As Object, e As DragEventArgs) Handles ToolStrip1.DragEnter
    16. e.Effect = DragDropEffects.All 'nur mit dieser Zeile ...
    17. End Sub
    18. Private Sub ToolStripButton1_DragDrop(sender As Object, e As DragEventArgs) Handles ToolStripButton1.DragDrop
    19. Stop '...wird diese Zeile bei mir erreicht
    20. End Sub


    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.

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

    Nabend
    vielen Dank Ihr beiden.
    @ErfinderDesRades: wenn ich Zeit hab mach ich was, die Anwendung die ich jetzt habe ist viel zu gross.
    @VaporiZed: funktioniert mit Einschränkungen. Wenn "ToolStrip1.AllowDrop = True" eingestellt ist dann sind nämlich alle Buttons erlaubt. Ein Einschränkung mit

    VB.NET-Quellcode

    1. Private Sub ToolStripButton7_DragEnter(sender As Object, e As DragEventArgs) Handles ToolStripButton7.DragEnter
    2. e.Effect = DragDropEffects.None
    3. End Sub

    hat keinerlei Auswirkungen mehr.
    Seltsam oder?
    Grüsse
    Gregor

    HalliHallo schrieb:

    VB.NET-Quellcode

    1. e.Effect = DragDropEffects.None
    ist in diesem Kontext falsch.
    Diese Zeile schaltet den Maus-Cursor um auf das, was da geDragt wird.
    Du musst prüfen, was da ankommt, und je nach dem musst Du .Effect setzen.
    Teste dies:

    VB.NET-Quellcode

    1. e.Effect = e.AllowedEffect
    und dann zieh eine Datei oder den markierten Text aus dem Notepad auf die Form.
    Betrachte den Maus-Cursor, erkenne Unterschiede.
    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: Habe den Unterschied erkannt. Aber bei meinem Problem (bei verschiedenen ToolStrip-Buttons den Maus-Cursor auf "Verboten" zu schalten) hilft mir das nicht weiter. Nach wie vor bleibt alles wie gehabt. Maus Cursor ist immer "Kopieren" oder "Verschieben" oder so, aber nie verboten.
    Und das obwohl: "ToolStripDropDownButton1.AllowDrop = False" eingestellt ist.
    @HalliHallo Kannst Du mal das Projekt / den signifikanten Projektrumpf posten?
    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!
    Hallo,
    hatte jetzt endlich Zeit eine kleine Beispielanwendung zu schreiben.
    Gedraggt wird von der FormDragDrop aus dem Control TreeView1
    Es kann auf die TextBox1 gedaggt werden, nicht aber auf TextBox2: Funktioniert
    Code in formDragDrop:

    VB.NET-Quellcode

    1. Private Sub TreeView1_MouseDown(sender As Object, e As MouseEventArgs) Handles TreeView1.MouseDown
    2. If e.Button <> MouseButtons.Left Then Return
    3. _DragStart = e.Location
    4. End Sub
    5. Private Sub TreeView1_MouseMove(sender As Object, e As MouseEventArgs) Handles TreeView1.MouseMove
    6. If e.Button = MouseButtons.Left Then
    7. 'Vielen Dank an... "ErfinderdesRades"
    8. With e.Location ' draggen erst bei Ziehen über 3 Pix ( Quadrat-Distanz > 9 )
    9. If (_DragStart.X - .X) ^ 2 + (_DragStart.Y - .Y) ^ 2 <= 9 Then Return
    10. End With
    11. TreeView1.DoDragDrop("TEST", DragDropEffects.Copy)
    12. End If
    13. End Sub
    14. Private Sub TextBox1_DragEnter(sender As Object, e As DragEventArgs) Handles TextBox1.DragEnter
    15. e.Effect = DragDropEffects.All
    16. End Sub
    17. Private Sub TextBox2_DragEnter(sender As Object, e As DragEventArgs) Handles TextBox2.DragEnter
    18. e.Effect = DragDropEffects.None
    19. End Sub


    Dann kommt das Problem:
    Ich will auf verschieden Buttons im Toolstrip der MainForm draggen, NICHT auf alle.
    Erlauben will ich hier mal den NeuToolStripButton und nicht erlauben den SpeichernToolStripButton

    Hier der Code in FormMain:

    VB.NET-Quellcode

    1. Private Sub FormMain_Load(sender As Object, e As EventArgs) Handles Me.Load
    2. 'es muss für das komplette Toolstrip DragDrop erlaubt sein
    3. 'für die einzelnen Button erlauben reicht nicht.
    4. 'und wenn ich für einen Button das Draggen nicht erlaube bringt das nichts
    5. ToolStrip1.AllowDrop = True
    6. NeuToolStripButton.AllowDrop = True
    7. SpeichernToolStripButton.AllowDrop = False
    8. End Sub
    9. Private Sub ToolStrip1_DragEnter(sender As Object, e As DragEventArgs) Handles ToolStrip1.DragEnter
    10. 'Ohne diese Zeile geht gar nix. Da bringt es
    11. 'auch nix die einzelnen Buttos zu erlauben.
    12. e.Effect = DragDropEffects.All
    13. End Sub
    14. Private Sub NeuToolStripButton_DragEnter(sender As Object, e As DragEventArgs) Handles NeuToolStripButton.DragEnter
    15. e.Effect = DragDropEffects.All
    16. End Sub
    17. Private Sub SpeichernToolStripButton_DragEnter(sender As Object, e As DragEventArgs) Handles SpeichernToolStripButton.DragEnter
    18. e.Effect = DragDropEffects.None
    19. End Sub


    Und hier das ganze BeispielProjekt:
    Dateien
    @HalliHallo Was muss ich tun, um den Effekt zu reproduzieren?
    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

    Führe die Anwendung aus, Öffne die formDragDrop

    Dragge zuerst vom TreeView auf TextBox1
    dann dragge vom TreeView auf TextBox2
    dann dragge vom TreeView auf Toolstrip- Button "Neu"
    dann dragge vom TreeView auf Toolstrip- button "Speichern"
    Betrachte den Maus-Cursor, erkenne Unterschiede. ;) :)

    Auf Textbox1 und auf Button "Neu" ist das Draggen erlaubt.
    Auf Textbox2 und auf Button "Speichern" soll KEIN draggen erlaubt sein.

    Bei den Textboxen funktioniert es, bei den Buttons nicht.
    Grüße
    AFAIK ist das mit ToolStripButtons nicht möglich, da die Buttons nur vom Strip verwaltet werden. Sie sind keine eigenständigen Controls, haben kein eigenes Handle (was ich auch schon mal beim Thema Automatisierung mit Enttäuschung feststellen musste). Daher dürfte ein direkter Drop nicht möglich sein. Aber bestimmt mit Koordinatenberechnung. Drop auf Strip und dann berechnen/auswerten, über welchem Button es gedropped wurde. Mir ist klar, dass es ein Button-Highlighting gibt, aber ob das nutzbar ist? Ich fand noch keinen Weg.
    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
    Daher dürfte ein direkter Drop nicht möglich sein

    Das Droppen ist möglich. Daraum geht es überhaupt nicht. Die Sub

    VB.NET-Quellcode

    1. Private Sub ToolStripDropDownButtonKB_DragDrop(sender As Object, e As DragEventArgs) Handles ToolStripDropDownButtonKB.DragDrop

    wird beim Droppen für jeden Button korrekt aufgerufen.
    Es geht mir einzig und alleine darum wie der MouseCursor aussieht. Es soll sichtbar sein das auf die einen Buttons NICHT (MausCursor "Durchfahrt verboten" )gedroppt werden kann, und bei den erlaubten Buttons soll der MouseCursor Kopieren oder hinzufügen oder was auch immer sein.
    Dies sollte eigentlich in den Sub's

    VB.NET-Quellcode

    1. Private Sub BUTTTONXXXXX_DragEnter(sender As Object, e As DragEventArgs) Handles BUTTTONXXXXX.DragEnter
    2. e.Effect = DragDropEffects.All
    3. End Sub

    einstellbar sein. Diese Sub's werden auch korrekt für jeden Button aufgerufen. Aber der gewünschte Effect wird nicht ausgewertet
    Die Zeile

    VB.NET-Quellcode

    1. e.Effect = DragDropEffects.None

    hat keinerlei Auswirkungen.
    Aber, wahrscheinlich ist das Problem:
    Sie sind keine eigenständigen Controls

    wie du geschrieben hast. Und das dürfte nicht lösbar sein.
    Grüsse
    HalliHallo
    Ich glaub ich hab's: Stell bei den nicht erlaubten Dropzielen AllowDrop = True und beim DragOver-EventHandler e.Effect = DragDropEffects.None. So klappt es bei mir. Die Cursor werden nun richtig angezeigt, aber der DragDrop-EventHandler bei jenem CE wird nicht erreicht.
    Dateien
    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.

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