vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Maus & Tastatur · Drag & Drop   |   VB-Versionen: VB2005, VB2008, VB201017.12.12
Drag & Drop von Ordnern und Dateien mit Filter

Drag & Drop auf Steuerelemte, bei dem Ordner und/oder Dateien gedropt werden. Alle Daten werden dabei nochmals nach Dateiendung gefiltert.

Autor:   DierkBewertung:  Views:  10.333 
ohne HomepageSystem:  WinXP, Win7, Win8, Win10, Win11 Beispielprojekt auf CD 

Ich stand gerade vor der Aufgabe, in einem Projekt eine Listbox zu nutzen, in die der User per DragDrop ziehen kann was er gerade will. Es sollten aber nur bestimmte Dateien eingetragen werden. Dazu soll es möglich sein, Dateien oder Ordner (evtl. Unterordner, oder beides gemeinsam) zu dropen. Aus all den Daten die so gedropt werden können, sollen nun nur spezielle Dateien hinzugefügt werden. So kann man z.b. alle Dateien und Ordner eines Laufwerks einfach auf eine Listbox ziehen und bekommt alle ".mp3" Dateien eingetragen.

Bevor nun der Quellcode meiner Lösung kommt, sei nochmal erwähnt, dass dies nur ein Beispiel für eine Listbox ist. Der Code in die entsrpechenden Events eines anderen Elements (z.b. Listview) kopiert, funktioniert dort genauso.

Zum testen benötigen Sie eine Form und darauf eine Listbox1.

Imports System.Drawing.Drawing2D
Public Class Form1
 
  ' welche Dateien sollen alles hinzugefügt werden. 
  ' Der Filter bezieht sich hier auf die Dateiendung.
  ' {""} als Filter würde so z.b alle Dateien zulassen
  Private Filter() As String = {"mp3", "flac"}
 
  ' Für gedropte Ordner, kann hier noch gesagt werden, 
  ' ob alle Unterordner auch gedropt werden sollen
  Private SearchSubs As Boolean = True
 
  ' AllowDrop muss für das Steuerelement immer zugelassen sein, 
  ' damit Drag & Drop überhaupt funktioniert.
  ' Dies kann natürlich auch bereits im Designer erfolgen. 
  ' Dann wäre dieser Aufruf nicht mehr erforderlich.
  Private Sub ListBox1_HandleCreated(ByVal sender As Object, ByVal e As EventArgs) _
    Handles ListBox1.HandleCreated
 
    ListBox1.AllowDrop = True
  End Sub
 
  ' Jetzt wird nur der FileDropEffects definiert. In unserem Fall Copy
  Private Sub ListBox1_DragEnter(ByVal sender As Object, ByVal e As DragEventArgs) _
    Handles ListBox1.DragEnter
 
    If (e.Data.GetDataPresent(DataFormats.FileDrop)) Then
      e.Effect = DragDropEffects.Copy
    End If
  End Sub
 
  ' Hier werden nun die gedropten Elemente ausgewertet
  Private Sub ListBox1_DragDrop(ByVal sender As Object, ByVal e As DragEventArgs) _
    Handles ListBox1.DragDrop
 
    ' Array für alle gedropten Daten
    Dim link() As String = Nothing
 
    ' Daten zum Array hinzufügen
    If e.Data.GetDataPresent(DataFormats.FileDrop) Then
      link = e.Data.GetData(DataFormats.FileDrop)
    End If
 
    ' wenn Daten ins Array geschrieben wurden
    If Not IsNothing(link) Then
      ' Schleife über alle Daten
      For Each s As String In link
        ' wenn der Eintrag ein Ordner ist
        If My.Computer.FileSystem.DirectoryExists(s) Then
          Dim files As ReadOnlyCollection(Of String)
          ' Hier kommt jetzt unser "SearchSubs" zum Einsatz
          If SearchSubs = True Then
            files = My.Computer.FileSystem.GetFiles(s, FileIO.SearchOption.SearchAllSubDirectories)
          Else
            files = My.Computer.FileSystem.GetFiles(s, FileIO.SearchOption.SearchTopLevelOnly)
          End If
          ' jetzt werden alle gefillterten Daten weitergeleitet
          For Each s2 As String In files
            DragDropAdd(s2)
          Next
        Else
          ' wenn es kein Ordner war, kann direckt weitergeleitet werden
          DragDropAdd(s)
        End If
      Next
    End If
  End Sub
 
  ' Hier erfolgt jetzt das endgültige hinzufügen zu Steuerelement
  Private Sub DragDropAdd(ByVal Data As String)
    ' alle eingetragenen Filter durchlaufen
    For Each f As String In Filter
      ' Hier wird die Dateiendung mit dem Filter verglichen
      If Mid(Data, (Data.Length - f.Length) + 1) = f Then
        ' in diesem Beispiel werden die Daten nun in die Listbox geschrieben
        ' da der obige Code (Inhalt der Events) ja in allen DragDrop tauglichen
        ' Steuerelementen funktioniert, muß hier darauf geachtet werden,
        ' wie die Daten dem jeweiligen Steuerelemnt hinzugefügt werden.
        ListBox1.Items.Add(Data)
      End If
    Next
  End Sub
 
End Class



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6
(einschl. Beispielprojekt!)

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.