Drag and Drop
Providing your users with Drag and Drop options will make your applications more user friendly.
The ability to drag and drop is common for Windows applications. Those users who prefer mouse operations to the keyboard expect to be able to drag and drop items both within an application and between applications.
Dragging and dropping helps to reduce errors and speeds up certain types of user actions. It is particularly important for those users that prefer the mouse to the keyboard. The example provided here covers one of the most common uses of drag and drop – dragging a collection of items from Windows Explorer – but it includes an extra twist to demonstrate one techinque for controlling the drop operation.
The example will show how to drop a list of folder (directory) names onto a listbox. The code checks that the dragged object is a list of strings. It then creates a FileInfo object from each string in the list, and checks whether it refers to a valid folder. If it does, it is added to the list. If it does not refer to a valid folder, it is ignored. This code would enable a user to select all items in an Explorer window, drop them onto the list box, and have the folders (only) listed.
Note that the DragEnter method code simply checks that there is something to be dropped, and sets the effects to All. As nothing is going to be copied or moved, it doesn’t matter at this stage whether the effect is Copy or Move – if this is important, the effect should be set appropriately at this point. The DragDrop method then gets the list of strings, and creates a DirectoryInfo object from each one. Note that the DirectoryInfo object simply requires a non-null string – the subsequent check with the .Exists method is required to separate the filenames from the folder names. Only the foldernames are added to the list.
Private Sub ListBox1_DragEnter(ByVal sender As Object, ByVal e As _ System.Windows.Forms.DragEventArgs) Handles ListBox1.DragEnter If e.Data.GetDataPresent(DataFormats.FileDrop) Then e.Effect = DragDropEffects.All End If End Sub Private Sub ListBox1_DragDrop(ByVal sender As Object, ByVal e As _ System.Windows.Forms.DragEventArgs) Handles ListBox1.DragDrop If e.Data.GetDataPresent(DataFormats.FileDrop) Then Dim MyFiles() As String ' Assign the files to an array. MyFiles = e.Data.GetData(DataFormats.FileDrop) ' Loop through the array and add the files to the list. For Each F As String In MyFiles Dim di As DirectoryInfo = New DirectoryInfo(F) If di.Exists Then ListBox1.Items.Add(F) End If Next End If End Sub