| |
VB.NET - Ein- und UmsteigerTreeview - Verzeichnis anzeigen, in denen auch Dateien sind | | | Autor: Volker Bunge | Datum: 24.04.14 12:18 |
| Hallo zusammen,
da ich gerade dabei bin, mir einen eigenen Folderdialog zu basteln, bin ich auf ein Problem gestossen.
Ich möchte mit einem Treeview nur die Verzeichnisse sehen, in denen sich z. Bsp. MP3 Dateien befinden.
Mit dem u. g. Code bekomme ich leider alle Verzeichnisse eines Laufwerkes angezeigt. Es sollen aber nur die Verzeichnisse angezeigt werde, in dene sich MP3-Dateien befinden.
' **************************************************************
' *
' * Explorer TreeView Komponenten-Klasse (VB.Net 2005)
' *
' * Diese Klasse stellt ein Explorer TreeView zur Vergügung.
' * Mit der überladenen Methode "ShowTree" wird das TreeView
' * initialisiert.
' *
' * Februar 2007 - VB-Power.net
' * http://www.vb-power.net/
' *
' **************************************************************
Option Explicit On
Option Strict On
Imports System.IO
Public Class ExpTree
Inherits System.Windows.Forms.TreeView
Sub Clear()
Me.Nodes.Clear()
End Sub
Sub Show_all()
Me.ExpandAll()
End Sub
Public Sub New()
Me.Sort()
Me.HotTracking = True
Me.HideSelection = False
End Sub
Public Sub ShowTree(ByVal Vorher_leeren As Boolean, ByVal Alle_Anzeigen As _
Boolean)
For Each d As DriveInfo In DriveInfo.GetDrives
Me.ShowTree(d.Name, Vorher_leeren, Alle_Anzeigen) ', Alle_Anzeigen)
Next
If Alle_Anzeigen = True Then ExpandAll()
End Sub
Public Sub ShowTree(ByVal Path As String, ByVal Vorher_Leeren As Boolean, _
ByVal Alle_Anzeigen As Boolean) ', ByVal Alle_Anzeigen As Boolean)
If Vorher_Leeren = True Then Clear()
Dim nNode As New TreeNode(Path)
Me.Nodes.Add(nNode)
Me.FillTreeNode(nNode)
If Alle_Anzeigen = True Then ExpandAll()
End Sub
Public Sub ShowTree(ByVal DriveType As DriveType, ByVal Vorher_leeren As _
Boolean, ByVal Alle_Anzeigen As Boolean)
For Each d As DriveInfo In DriveInfo.GetDrives
If d.DriveType = DriveType Then
Me.ShowTree(d.Name, Vorher_leeren, Alle_Anzeigen)
End If
Next
End Sub
Private Sub FillTreeNode(ByVal dNode As TreeNode)
Try
Dim d As New DirectoryInfo(dNode.FullPath)
For Each di As DirectoryInfo In d.GetDirectories
'MsgBox(d.FullName & di.Name)
' Das hier deaktivierte Filtern funktioniert zwar, erlaubt aber keine weitere
' Suche der Unterverzeichnisse
'Dim files() As String = Nothing
'files = Directory.GetFiles(d.FullName & "\" & di.Name, "*.mp3")
'If (files.Length > 0) Then
' MsgBox("Gefunden: " & d.FullName & di.Name)
Dim nNode As New TreeNode(di.Name)
dNode.Nodes.Add(nNode)
nNode.Nodes.Add("")
'End If
Next
Catch : End Try
End Sub
Protected Overrides Sub OnBeforeExpand(ByVal e As _
System.Windows.Forms.TreeViewCancelEventArgs)
Dim n As TreeNode = CType(e.Node, TreeNode)
If n.Nodes(0).Text = "" Then
Me.BeginUpdate()
n.Nodes.Clear()
Me.FillTreeNode(n)
Me.EndUpdate()
End If
MyBase.OnBeforeExpand(e)
End Sub
End Class
Aufruf: ExpTree1.ShowTree(Tbox_Verzeichnis.Text, True, True) Als Lösungsansatz habe ich mir überlegt, dass ich nach dem Aufbau, das Treeview noch einmal kpl. durchlaufe und mir das tiefste Verzeichnis nehme, dort nach MP3-Dateien suche und wenn keine vorhanden sind, diesen Knoten dann lösche.
Ich habe leider keine Ahnung, wie ich das bewerkstelligen soll und ich beführte, dass diese Holzhammermethode nicht sehr gut ist.
Könntet Ihr mir einen Tip / Lösung nennen. wie ich mein Problem lösen könnte?
Vielen Dank
Volker | |
Re: Treeview - Verzeichnis anzeigen, in denen auch Dateien sind | | | Autor: FZelle (Moderator) | Datum: 24.04.14 13:02 |
| Ja, hör auf in Controls zu denken.
1. Lese dir die MP3 Dateien in eine eigene Liste
2. Erstelle dann erst den Tree, anhand der liste
| |
Re: Treeview - Verzeichnis anzeigen, in denen auch Dateien sind | | | Autor: Volker Bunge | Datum: 25.04.14 18:55 |
| Hallo FZelle,
hier mal mein Code
Private Sub Dateien_Suchen(Startverzeichnis As String, Dateifilter As String)
LBox_Gefunden_Verzeichnisse.Items.Clear()
Dim aktuelles_Verzeichnis As String
Dim list As List(Of String) = FileHelper.GetFilesRecursive( _
Startverzeichnis)
aktuelles_Verzeichnis = ""
For Each path In list
If InStr(path, "RECYCLE.BIN") = 0 Then
If aktuelles_Verzeichnis <> IO.Path.GetDirectoryName(path) Then
aktuelles_Verzeichnis = IO.Path.GetDirectoryName(path)
Dim files() As String = Nothing
files = Directory.GetFiles(aktuelles_Verzeichnis & "\", _
Dateifilter)
If (files.Length > 0) Then
LBox_Gefunden_Verzeichnisse.Items.Add( _
IO.Path.GetDirectoryName(path))
End If
End If
End If
Next
Treeview_Anzeigen()
End Sub
Sub Treeview_Anzeigen()
TreeView1.Nodes.Clear()
For Each Verz In LBox_Gefunden_Verzeichnisse.Items
Dim nNode As New TreeNode(Mid(Verz.ToString, 1, 3))
Dim Verzeichnis As String = Mid(Verz.ToString, 4, 255)
Dim VerzeichnissArray() As String = Split(Verzeichnis, "\")
TreeView1.Nodes.Add(nNode)
For v = 0 To VerzeichnissArray.Length - 1
Dim subnode = nNode.Nodes.Add(VerzeichnissArray(v))
nNode = subnode
Next
Next
TreeView1.ExpandAll()
End Sub So wie er hier steht läuft das Finden der Dateien super. Nur der Treeview wird leider nicht richtig aufgebaut.
Die Baumstruktur wird für jedes Listviewverzeichnis neu erstellt.
Leider bekomme ich es nicht hin, dass ich bei doppelten Verzeichnissen, den nächsten Node genau darunter stehen habe.
Kann mir jemand verraten, wie ich mich 'neu positionieren' kann, und die noch fehlenden SUBNodes an der richtigen Stelle anfüge?
Vielen Dank
Volker | |
Re: Treeview - Verzeichnis anzeigen, in denen auch Dateien sind | | | Autor: FZelle (Moderator) | Datum: 25.04.14 22:04 |
| 1. So liest du alles doppelt, wozu soll das gut sein?
2. Dim files() As String = Nothing das war unter VB6 wichtig, sowas muss man unter .NET nicht machen.
3. Was macht FileHelper.GetFilesRecursive?
| |
Re: Treeview - Verzeichnis anzeigen, in denen auch Dateien sind | | | Autor: Volker Bunge | Datum: 26.04.14 11:00 |
| Hallo FZelle,
Hier als erstes die fehlende Klasse FileHelper
Imports System.IO
''' <summary>
''' This class contains directory helper method(s).
''' </summary>
Public Class FileHelper
''' <summary>
''' This method starts at the specified directory, and traverses all
' subdirectories.
''' It returns a List of those directories.
''' </summary>
Public Shared Function GetFilesRecursive(ByVal initial As String) As List( _
Of String)
' This list stores the results.
Dim result As New List(Of String)
' This stack stores the directories to process.
Dim stack As New Stack(Of String)
' Add the initial directory
stack.Push(initial)
' Continue processing for each stacked directory
Do While (stack.Count > 0)
' Get top directory string
Dim dir As String = stack.Pop
Try
' Add all immediate file paths
result.AddRange(Directory.GetFiles(dir, "*.*"))
' Loop through all subdirectories and add them to the stack.
Dim directoryName As String
For Each directoryName In Directory.GetDirectories(dir)
stack.Push(directoryName)
Next
Catch ex As Exception
End Try
Loop
' Return the list
Return result
End Function
End Class Dim files() As String = Nothing habe ich in Dim files() As String geändert.
Deine Antwort "1. So liest du alles doppelt, wozu soll das gut sein? " verstehe ich nicht ganz. Wenn Du meinst, dass das Listview auch eine Variable sein kann, so gebe ich Dir recht. Das Listview dient hier erst einmal nur zur Anzeige. Werde es später noch ändern.
Was ich aber immer noch nicht verstehe, ist das mit dem Treeview. Ich weiss, das es ein Hauptnodes (Laufwerksbuchstabe F:\) gibt. Unter diesem müssen Unternodes angelegt werden, die dann wiederum Unternodes benötigen usw. Unternodes sind somit meine Verzeichnisstruktur. Für den ersten Eintrag im Listview funktioniert das ja auch super.
Mein Problem ist es, zu prüfen, ob es dieses Unternodes bereits gibt, wenn ja, dann muß der Bezug/Verweis doch auf dieses Nodes gesetzt werden, damit das nächste Node weis, wo zu es gehört. Sollte es das Node nicht geben, so muß dieses angelegt und als aktueller Bezug/Verweis gesetzt werden.
Sollte meine Erklärung richtig sein, so habe ich leider keine Ahnung, wie ich das anstelle. Das mein bisheriger Code dies nicht so kann, ist mir klar.
Ich habe auch schon so einiges ausprobiert, leider ohne Erfolg.
Für ein kleines Bsp. wäre ich Dir/Euch sehr dankbar.
Vielen Dank
Volker | |
Re: Treeview - Verzeichnis anzeigen, in denen auch Dateien sind | | | Autor: FZelle (Moderator) | Datum: 26.04.14 14:33 |
| 1. Du hast immer noch nicht verstanden das nicht das ListView die Daten hat/hält sondern du die selber hälst.
2. Du nennst die routine GetFilesRecursive machst sie aber nicht recursive sondern ziemlich umständlich in einer entrollten doppelten schleife.
3. Statt irgendwas zu probieren, lies mal ein tutorial z,b, http://www.codeproject.com/Articles/23114/Working-with-TreeView-Controls
| |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats Neu! sevCoolbar 3.0
Professionelle Toolbars im modernen Design!
Mit sevCoolbar erstellen Sie in wenigen Minuten ansprechende und moderne Toolbars und passen diese optimal an das Layout Ihrer Anwendung an (inkl. große Symbolbibliothek) - für VB und MS-Access Weitere Infos
|