Hallo zusammen,
Gibt es eine Möglichkeit, festzustellen, ob ein Drag-and-Drop Vorgang beendet ist.
Beispiel:
Ein User zieht z.B. in einem TreeView ein Element und legt es an irgendeiner Stelle auf dem Desktop ab (was nicht funktioniert und dazu führt, dass der Vorgang abgebrochen wird). Nun möchte ich aber trotzdem wissen, ob der User das Objekt noch zieht. Ist dies der Fall, könnte er es ja auch wieder in die TreeView ziehen und an einer gültigen Stelle ablegen. Wenn nicht, sollten die Variablen, die ich beim Start des Drag-and-Drop-Vorgangs abgelegt habe, wieder zurückgesetzt werden.
Die Variablen müssen zurückgesetzt werden, da man nicht nur innerhalb der TreeView Objekte ziehen können muss, sondern auch Dateien aus dem Explorer in die TreeView. Falls die Variablen allerdings beim Ziehen eines Objekts aus dem Explorer in die TreeView noch gesetzt sind, reagiert diese falsch.
Eine andere Möglichkeit wäre auch noch, ein eigenes DataFormat zu definieren, in das ich die Variablen legen kann. Ist das vielleicht möglich?
Vielen Dank für die Antwort schonmal im Voraus,
Thomas
Hallo the-one,
vielleicht hilft dir dabei QueryContinueDrag oder so weiter.
Lg XXX
Hmmm, ich hab erst gedacht du machst nen einfachen Drag&Drop. Nachdem ch mir jetzt aber nochmal deinen Text durch gelesen habe, versteh ich nur Bahnhof.
Wenn ein Object per Drag&Drop gecancelt wird, dann ind die Variablen leer. Wenn es nicht gecancelt wird, löst dein TreeView ein OnDragOver event aus, in dem du schauen kannst, welche DatenTyp das Drag item hat.
Was willst du jetzt anders haben? Den DatenTyp den der Explorer mit schickt?
Gruss Ari
Wer lesen kann ist klar im vorteil!
MSDN
Dein Feund in allen fragen
ok, ist vielleicht an manchen Stellen etwas komisch geschrieben, zu dem Zeitpunkt war ich selber etwas verwirrt 😁
erst einmal an xxxprod:
QueryContinueDrag hab ich ausprobiert, das funktioniert ohne Tricks nicht außerhalb der TreeView und auch mit Tricks nicht außerhalb des eigenen Forms.
Was ich genau will:
Wenn jemand einen Eintrag innerhalb des TreeView verschieben will, soll er das machen. D.h. draggen eines Nodes und droppen an einer anderen Stelle im Baum ist möglich. Hierbei wird beim Starten des Draggen eine lokale Variable gesetzt und dann beim Drop diese ausgelesen, um die Quelle zu finden.
Es soll aber auch möglich sein, Elemente aus dem Explorer zu ziehen und in die TreeView zu droppen. Dies passiert über Standard-Drag-and-Drop (d.h. ein String[] mit fileNames).
Mein Problem besteht jetzt in den Kombinationen von beiden Drag-Arten. Zum Beispiel ziehe ich ein Element aus der TreeView und droppe es dann außerhalb der eigenen Form. Ich bekomme von diesem Drop allerdings nichts mit (es ist ja in der Anwendung nicht zulässig, einen Node auf den Desktop zu ziehen und ich werde aus diesem Grund nicht benachrichtig). Nun denkt die Anwendung, dass ich immer noch einen Node aus dem Baum ziehe (was nicht mehr der Fall ist), da die Variablen für die Quelle noch gesetzt sind. Versuche ich nun, Elemente aus dem Explorer in die TreeView zu ziehen, denkt sich die Programmlogik, dass es sich immer noch um den alten Baumknoten handelt und verschiebt diesen.
Ich sehe dafür zwei Lösungsmöglichkeiten.
Eine davon wäre mit einem Event zu realisieren, das mir mitteilt, wann der Drag-and-Drop-Vorgang abgebrochen wurde (oder aber eine Eigenschaft, die mir diese Information liefert). Dann könnte ich die Variablen für die Quelle auf null setzen und würde die Drag-and-Drop-Vorgänge nicht mehr miteinander verwechseln.
Eine zweite Lösung wäre es, ein Objekt als Data mitzuschicken, das ich dann überprüfen kann (wie es beim std-Drag-and-Drop auch gemacht wird). Ich kann momentan zwar das Objekt mitschicken, aber ich kann die Typen nur mit den Standard-Typen für Clipboard (also die aus System.Windows.Forms.DataFormat) matchen, was aber bei einem Objekt nicht funktioniert. Die Daten aus Data einfach zu casten funktioniert leider auch nicht.
Für Java habe ich bereits gesehen, dass man zu den Standard-DataFormat's noch eigene Formate erstellen kann, für C# bisher noch nicht.
Ich hoffe, jetzt ist es etwas klarer geworden ...
Für Java habe ich bereits gesehen, dass man zu den Standard-DataFormat's noch eigene Formate erstellen kann, für C# bisher noch nicht.
Du kannst den Type als string mitgeben (in einem eigenen IDataObject)