primitiv-Sample, wie anwendungsübergreifendes DragnDrop umsetzbar ist:
Vorraussetzung, dass ühaupt auf ein Control gedropt werden kann, ist, dass seine
Control.AllowDrop - Property auf True eingestellt ist (ist hier im FormDesigner erledigt, geht aber auch per Code)
Wichtig ist v.a. das Verständnis des DataObjects, das in den EventArgs angeliefert wird.
Ein DataObject enthält die Daten, zuzüglich Informationen über den Datentyp.
Es kann "dieselben" Daten in verschiedenen Formaten enthalten (zB sowohl als "Text", als auch als "Richtext") - hier wird aber jeweils nur ein Format abgefragt.
Ist (im Drag_Enter) das gewünschte Datenformat nicht enthalten, so wird kein DragDropEffect gesetzt, und dann kann auch nicht gedropt werden (was dem User mittels des entsprechenden Cursor-Icon angezeigt wird)
e.Data wird etwas unspezifisch als IDataObject angeliefert - der Cast auf System.Windows.Forms.DataObject erleichtert die Handhabung.
data.GetFileDropList wird als System.Collections.Specialized.StringCollection angeliefert - das ist eiglich ein veralteter AuflistungsTyp für Strings - heutzutage nähme man natürlich List(Of String). Aber DragnDrop ist halt älter als das Framework2, und wg. Abwärtskompatibilität habenses wohl so belassen.
weitere Möglichkeiten von DragnDrop
Im DragEnter kann mit der Status der Modifier-Tasten (Shift, Strg, Alt, Alt+Strg) abgefragt werden, und dementsprechend der gemeinte DropEffect festgelegt werden - was dem User per Cursor-Icon signalisiert wird.
Dieser Effect wird dann auch ins DragDrop-Event transportiert, sodass dort spezifisch reagiert werden kann, etwa "Kopieren" im Unterschied zu "Verschieben", und derlei Dinge.
Auch kann statt des _DragEnter-Events das _DragOver-Event verarbeitet werden, welches in schneller Folge während des gesamten DragOvers gefeuert wird.
Dadurch erhält der User Gelegenheit, mittels der Modifier-Tasten, die gemeinte Aktion noch während des Draggens zu ändern.
Sample-Code-Zips:
DragDropSample ist das Sample hier zu diesem Post, also einfaches anwendungsübergreifendes Dragging.
DragjobTester ist ein Sample für Draggen innerhalb der Anwendung. Das ist im Grunde ein wesentlich verschiedenes Thema, auf das ich erst in post#9 eingehe.
ich häng nun noch DragjobTester an, ein klein Projekt für Draggen innerhalb der Anwendung.
Besonderer Trick dabei ist, dass von einem DatagridView mit Multiselection gedraggt wird. Die Crux speziell dabei ist, dass das DGV seine Selection bereits beim MouseDown löscht.
Daher habe ich eine Speicherklasse für diese Selection mir ausgedacht, mit der man sie eben wieder herstellen kann.
VB.NET-Quellcode
- Imports System.Collections.Specialized
- Public Class frmDragDropSample
- Private Sub Control_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs) _
- Handles TextBox1.DragDrop, ListBox1.DragDrop
- Dim data = DirectCast(e.Data, DataObject)
- Select Case True
- Case sender Is TextBox1
- 'zum Testen kann Text aussm VS-Editor auf die Textbox gezogen werden
- Dim txt As String = data.GetText
- TextBox1.AppendText(txt & Environment.NewLine)
- Case sender Is ListBox1
- 'zum Testen können Dateien/Ordner aussm DateiBrowser auf die ListBox gezogen werden
- Dim files As StringCollection = data.GetFileDropList
- For Each file As String In files
- ListBox1.Items.Add(file)
- Next
- End Select
- End Sub
- Private Sub Control_DragEnter(ByVal sender As Object, ByVal e As DragEventArgs) _
- Handles ListBox1.DragEnter, TextBox1.DragEnter
- 'erlaubte DropEffects festlegen
- Dim data = DirectCast(e.Data, DataObject)
- Select Case True
- Case sender Is TextBox1
- If data.ContainsText Then e.Effect = DragDropEffects.All
- Case sender Is ListBox1
- If data.ContainsFileDropList Then e.Effect = DragDropEffects.All
- End Select
- End Sub
- End Class
Vorraussetzung, dass ühaupt auf ein Control gedropt werden kann, ist, dass seine
Control.AllowDrop - Property auf True eingestellt ist (ist hier im FormDesigner erledigt, geht aber auch per Code)
Wichtig ist v.a. das Verständnis des DataObjects, das in den EventArgs angeliefert wird.
Ein DataObject enthält die Daten, zuzüglich Informationen über den Datentyp.
Es kann "dieselben" Daten in verschiedenen Formaten enthalten (zB sowohl als "Text", als auch als "Richtext") - hier wird aber jeweils nur ein Format abgefragt.
Ist (im Drag_Enter) das gewünschte Datenformat nicht enthalten, so wird kein DragDropEffect gesetzt, und dann kann auch nicht gedropt werden (was dem User mittels des entsprechenden Cursor-Icon angezeigt wird)
e.Data wird etwas unspezifisch als IDataObject angeliefert - der Cast auf System.Windows.Forms.DataObject erleichtert die Handhabung.
data.GetFileDropList wird als System.Collections.Specialized.StringCollection angeliefert - das ist eiglich ein veralteter AuflistungsTyp für Strings - heutzutage nähme man natürlich List(Of String). Aber DragnDrop ist halt älter als das Framework2, und wg. Abwärtskompatibilität habenses wohl so belassen.
weitere Möglichkeiten von DragnDrop
Im DragEnter kann mit der Status der Modifier-Tasten (Shift, Strg, Alt, Alt+Strg) abgefragt werden, und dementsprechend der gemeinte DropEffect festgelegt werden - was dem User per Cursor-Icon signalisiert wird.
Dieser Effect wird dann auch ins DragDrop-Event transportiert, sodass dort spezifisch reagiert werden kann, etwa "Kopieren" im Unterschied zu "Verschieben", und derlei Dinge.
Auch kann statt des _DragEnter-Events das _DragOver-Event verarbeitet werden, welches in schneller Folge während des gesamten DragOvers gefeuert wird.
Dadurch erhält der User Gelegenheit, mittels der Modifier-Tasten, die gemeinte Aktion noch während des Draggens zu ändern.
Sample-Code-Zips:
DragDropSample ist das Sample hier zu diesem Post, also einfaches anwendungsübergreifendes Dragging.
DragjobTester ist ein Sample für Draggen innerhalb der Anwendung. Das ist im Grunde ein wesentlich verschiedenes Thema, auf das ich erst in post#9 eingehe.
ich häng nun noch DragjobTester an, ein klein Projekt für Draggen innerhalb der Anwendung.
Besonderer Trick dabei ist, dass von einem DatagridView mit Multiselection gedraggt wird. Die Crux speziell dabei ist, dass das DGV seine Selection bereits beim MouseDown löscht.
Daher habe ich eine Speicherklasse für diese Selection mir ausgedacht, mit der man sie eben wieder herstellen kann.
Dieser Beitrag wurde bereits 9 mal editiert, zuletzt von „ErfinderDesRades“ ()