vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Brandneu! sevEingabe v3.0 - Das Eingabecontrol der Superlative!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   RSS-Feeds  | Newsletter  | Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2018
 
zurück
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:     [ Jetzt bewerten ]Views:  6.977 
ohne HomepageSystem:  WinXP, Vista, Win7, Win8, Win10 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

Dieser Tipp wurde bereits 6.977 mal aufgerufen.

Voriger Tipp   |   Zufälliger Tipp   |   Nächster Tipp

Über diesen Tipp im Forum diskutieren
Haben Sie Fragen oder Anregungen zu diesem Tipp, können Sie gerne mit anderen darüber in unserem Forum diskutieren.

Neue Diskussion eröffnen

nach obenzurück


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.
 
   

Druckansicht Druckansicht Copyright ©2000-2018 vb@rchiv Dieter Otter
Alle 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.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel