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   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Treeview - 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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Treeview - Verzeichnis anzeigen, in denen auch Dateien sind 
Autor: ModeratorFZelle (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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Treeview - Verzeichnis anzeigen, in denen auch Dateien sind 
Autor: ModeratorFZelle (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?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Treeview - Verzeichnis anzeigen, in denen auch Dateien sind 
Autor: ModeratorFZelle (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
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

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

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 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