vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
TOP-Angebot: 17 bzw. 24 Entwickler-Vollversionen zum unschlagbaren Preis!  
 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
Datei Suche mit Listbox 
Autor: alex-fw
Datum: 16.12.14 13:55

Hallo zusammen,
ich bin neue hier und ein Anfänger in VB.Net
Ich versuche eine Windows Applikation zu entwickeln, die nicht fortgeschrittene Benutzern bei Datei suche hilft.
In zwei Wörter eine abgespeckte clone Windows Explorer Suchfunktion.
Es funktioniert soweit, nun habe ich Probleme mit ListBox Aktualisierung / Sortierung.
Dateinamen werde aktualisiert aber Pfad zu Datei nicht, auch wenn ich neue suche starte, werden neue Ergebnisse in der ListBox eingetragen und pfaden von alte suche werden neue Eintragungen zugeordnet.
Listbox.Items. Clear() hilft nicht.
Kann jemand mir vieleicht weiter helfen?

Imports System.IO
Public Class Form1
Private paths() As String = {"x"}
Private Sub ListBox1_DoubleClick(ByVal sender As Object, ByVal e As _
  System.EventArgs) Handles ListBox1.DoubleClick
Process.Start(paths(ListBox1.SelectedIndices(0) + 1))
 
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As _
  System.EventArgs) Handles Button1.Click
Dim dInitPath As DirectoryInfo
Dim lSearchpattern As List(Of String)
Dim lFiles As List(Of FileInfo)
ListBox1.Items.Clear()
 
lSearchpattern = New List(Of String)
lSearchpattern.Add("*" & ComboBox1.Text & "*" & "*" & TextBox1.Text & "*" & "*" _
  & TextBox2.Text & "*" & "*" & TextBox3.Text & "*" & "*.pdf" & "*")
dInitPath = New IO.DirectoryInfo("server")
lFiles = searchFiles(dInitPath, lSearchpattern)
For Each fiFile As FileInfo In lFiles
ListBox1.Items.Add(fiFile.Name)
ReDim Preserve paths(paths.Length)
paths(paths.Length - 1) = fiFile.FullName
Next
End Sub
Private Function searchFiles(ByVal dPath As DirectoryInfo, ByVal _
lSearchpattern As List(Of String)) As List(Of FileInfo)
Dim lFiles As List(Of FileInfo) = New List(Of FileInfo)
For Each sPattern As String In lSearchpattern
For Each fiFile As FileInfo In dPath.GetFiles(sPattern, _
  SearchOption.AllDirectories)
lFiles.Add(fiFile)
Next
Next
Return lFiles
End Function
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datei Suche mit Listbox 
Autor: Manfred X
Datum: 17.12.14 07:14

Hallo!

Falls ich den unübersichtlich gestalteten Code richtig
gelesen habe, setzt Du in der Routine "Button1_Click" zwar
die Items-Auflistung der Listbox zurück (Clear), aber das
Array "Paths" ist auf Modulebene deklariert und wird per
"Redim Preserve"-Anweisung nur jeweils um einen Eintrag verlängert.

Nutze besser eine Datatable und erstelle dort die Spalten
"Filename" und "FilePath".
Die Angaben zu einem File schreibst Du jeweils in eine neue
Zeile. Die Listbox bindest Du danach an diese Datatable
(Stichworte: DataSource, Datamember).
Beispiele findest Du im Forum. Falls es nicht klappt,
frage noch einmal nach.


Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datei Suche mit Listbox 
Autor: Manfred X
Datum: 17.12.14 08:12

Sorry! Das Stichwort heißt beim der Listbox "Displaymember" nicht "Datamember"
(= Angabe der Table-Spalte, die angezeigt werden soll).

Die Datamember-Eigenschaft legt z.B. bei der Bindingsource fest, welche Liste
für die Bindung genutzt wird.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datei Suche mit Listbox 
Autor: alex-fw
Datum: 17.12.14 08:19

Hallo Manfred X,

ja, das ist mein Problem das Aray "Paths" wird nicht zurückgesetzt.
Ich bin neue in VB.Net und wenn ich dich richtig verstehe eine Datatable
ist eine separate Datenbank gemeint, (z.b. Excel, Access)
Suchergebnisse mit Filename in eine Spalte schreiben, Filepath in eine andere und das alles in listbox einlesen.
Mein Ziel, in Listbox nur Filename anzeigen ohne Pfad und wenn‘s möglich alles in ein Programm abschließen zu können ohne weitere Software oder Datenbanken.
In kurzem, auf dem Server sind Verzeichnisse mit verschiedene Unterverzeichnisstrukturen erstellt und mit pdf Dateien je nach Thema befühlt.
Es sind ca. 10000 Dateien eingestellt, derzeitige Darstellung wird mit ein php script erledigt, auch Suchfunktion ist integriert.
Der ganze Ablauf ist sehr langsam auch Suchfunktion.
Um ein Datei zu finden, muss ich mir Verzeichnisstruktur merken, wo der Datei abgelegt ist
oder Suchfunktion benutzen, das dauert sehr lange.
Mein Gedanke war, eine Software (Desktop-Anwendung, Windows Form Applikation oder Browser Anwendung) zu entwickeln mit 3 - 4 Textfeldern zum eintragen mögliche Suchbegriffen, um die Dateien zu finden.
Ein ähnlicher Ablauf wie im Windows Explorer Suchfunktion.
Hast du eine Idee wie man das am besten realisieren kann?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datei Suche mit Listbox 
Autor: Manfred X
Datum: 17.12.14 08:38

Um das Array zurückzusetzen: Redim Paths(0) (hinter Listbox.Items.Clear).

Die Datatable ist eine Net-Klasse und stellt das Kernstück der Datenhaltung
im Speicher für ADO.Net dar.

Schau Dir als Beispiel diese beiden Funktionen an ..
(Es werden als Parameter eine Listbox, ein Verzeichnis und ein Suchmuster an die
Routine "FilesToListbox" übergeben.)
    Private Sub FilesToListbox(ByVal lboFiles As ListBox, _
        ByVal DirectoryToSearch As String, Searchpattern As String)
 
        lboFiles.DataSource = Nothing
 
        'Erstellen und Füllen der Datatable
        Dim Filetable As New DataTable
        If FilesToDatatable(Filetable, DirectoryToSearch, Searchpattern) < 1 Then
            MsgBox("Keine Dateien gefunden")
            Exit Sub
        End If
 
        'Bindung der Tabellenspalte an die Listbox
        lboFiles.DisplayMember = Filetable.Columns(0).ColumnName
        lboFiles.DataSource = Filetable
    End Sub
 
 
 
    Private Function FilesToDatatable(ByVal FileTable As DataTable, _
                                      ByVal DirectoryToSearch As String, _
                                      Searchpattern As String) As Integer
 
        'Füllen der Datatable-Zeilen
 
        If Not IO.Directory.Exists(DirectoryToSearch) Then Return -1
        If FileTable Is Nothing Then FileTable = New DataTable
 
        'Erstellen der Spalten (falls nötig)
        If Not FileTable.Columns.Contains("FileName") Then
            FileTable.Columns.Add(New DataColumn("FileName", GetType(String)))
        End If
 
        If Not FileTable.Columns.Contains("FilePath") Then
            FileTable.Columns.Add(New DataColumn("FilePath", GetType(String)))
        End If
 
        FileTable.Rows.Clear()
 
        Try
            For Each file As String In IO.Directory.GetFiles _
                (DirectoryToSearch, Searchpattern)
 
                FileTable.Rows.Add(IO.Path.GetFileName(file), DirectoryToSearch)
            Next file
 
            Return FileTable.Rows.Count
        Catch ex As Exception
            Return -1
        End Try
    End Function
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datei Suche mit Listbox 
Autor: alex-fw
Datum: 17.12.14 08:50


Danke Manfred,

funktioniert 100%!
Noch eine Frage:
Wie kann ich ein Progressbar steuern, damit ich sehen kann wie lange noch die Suchprozess dauern wird?

Mein Progressbar startet, wenn die Daten in Listbox eigetragen werden.

  Private Function searchFiles(ByVal dPath As DirectoryInfo, ByVal _
    lSearchpattern As List(Of String)) As List(Of FileInfo)
        Dim lFiles As List(Of FileInfo) = New List(Of FileInfo)
        ProgressBar1.Value = 0
        ProgressBar1.Style = ProgressBarStyle.Continuous
        ProgressBar1.Maximum = lSearchpattern.Count
        For Each sPattern As String In lSearchpattern
            For Each fiFile As FileInfo In dPath.GetFiles(sPattern, _
              SearchOption.AllDirectories)
                ProgressBar1.Increment(1)
                If ProgressBar1.Value = 100 Then
                End If
                lFiles.Add(fiFile)
            Next
        Next
        Return lFiles
    End Function
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datei Suche mit Listbox 
Autor: Manfred X
Datum: 17.12.14 09:00

Gut Frage!

Das Windows-Dateisystem liefert meines Wissens keine direkte Information darüber,
wie viele Files in einem Verzeichnis stehen oder einem Suchmuster entsprechen.
Erst nach dem Durchlaufen der Suchfunktion ist bekannt, wie viele Dateien
in den Verzeichnissen abgefragt worden sind und wie viele davon dem Muster entsprochen
haben. Deshalb kannst Du in der "Progressbar" keinen Wert für das "Maximum" angeben.

Eine "unscharfe Möglichkeit" wäre, die Anzahl der zu durchsuchenden Verzeichnisse als
"Maximum" festzulegen und jeweils nach dem Beendigen der Suche in einem Verzeichnis den
"Value" um 1 hochzusetzen.

Wenn es mehrere Suchmuster pro Verzeichnis gibt, könntest Du
"Zahl der Verzeichnisse x Zahl der Suchmuster" als Maximum wählen und nach dem Beenden
eines Suchmusters "Value" hochsetzen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datei Suche mit Listbox 
Autor: alex-fw
Datum: 17.12.14 09:13

Danke Manfred,

noch eins habe ich gemerkt, wenn ich ListBox Funktion Sorted auf True setze,
werden die Daten in Listbox sortiert, aber Array "Paths" nicht.
Kann ich irgendwie "Paths" zu Sortierung anpassen?
Also erst sortieren, dann pathen und dann in ListBox eintragen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datei Suche mit Listbox 
Autor: Manfred X
Datum: 17.12.14 09:22

Dein Array und Deine Listbox haben nichts miteinander zu tun !

(Die sukzessive Verlängerung einer Array-Dimension um jeweils
nur einen Eintrag durch Redim Preserve ist übrigens wenig effizient.)

Du benötigst für Deine Zwecke eine Klasse, die alle erforderlichen
Angaben zu einer Datei jeweils zusammenfaßt, wie z.B. die System.Data.Datatable.

Du kannst dann bei der Datenbindung an die Listbox eine "Bindingsource" benutzen und
durch deren "Sort"-Methode die Abfolge der Anzeige der Datenzeilen steuern (z.B.
hierarchisches Sortieren nach mehreren Spalten).

Auch dafür gibt es im Forum Beispiele ....




Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datei Suche mit Listbox 
Autor: alex-fw
Datum: 17.12.14 09:29

Danke nochmal Manfred,

du hast mir sehr geholfen,
ich versuche weiter voran zu kommen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datei Suche mit Listbox 
Autor: Manfred X
Datum: 17.12.14 09:45

Du mußt den obigen Beispielcode vermutlich nur ein wenig ausbauen (Arrays als Parameter der Suche)


    Private Sub FilesToListbox(ByVal lboFiles As ListBox, _
          ByVal DirectoryToSearch() As String, Searchpattern() As String)
 
        lboFiles.DataSource = Nothing
        Dim Filetable As New DataTable
        If FilesToDatatable(Filetable, DirectoryToSearch, Searchpattern) < 1 Then
            MsgBox("Keine Dateien gefunden")
            Exit Sub
        End If
 
        lboFiles.DisplayMember = Filetable.Columns(0).ColumnName
        lboFiles.DataSource = Filetable
    End Sub
 
 
 
    Private Function FilesToDatatable(ByVal FileTable As DataTable, _
                      ByVal DirectoryToSearch() As String, _
                      Byval Searchpattern() As String) As Integer
 
 
        If FileTable Is Nothing Then FileTable = New DataTable
 
        If Not FileTable.Columns.Contains("FileName") Then
            FileTable.Columns.Add(New DataColumn("FileName", GetType(String)))
        End If
 
        If Not FileTable.Columns.Contains("FilePath") Then
            FileTable.Columns.Add(New DataColumn("FilePath", GetType(String)))
        End If
 
 
        FileTable.Rows.Clear()
 
        Try
            For Each direc As String In DirectoryToSearch
                If IO.Directory.Exists(direc) Then
                    For Each sp As String In Searchpattern
                        For Each file As String In IO.Directory.GetFiles(direc, _
                          sp)
                            FileTable.Rows.Add(IO.Path.GetFileName(file), direc)
                        Next file
                    Next sp
                    'hier könnte man einen Progressbar-Value hochsetzen
                    'Maximum wäre DirectorySearch.Length * SearchPattern.Length
                End If
            Next direc
            Return FileTable.Rows.Count
        Catch ex As Exception
            Return -1
        End Try
    End Function
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datei Suche mit Listbox 
Autor: alex-fw
Datum: 17.12.14 09:55

Wenn ich richtig verstehe, ich muss die Suchergebnis in die Tabelle schreiben (Filename in eine Spalte, Filepath in andere), sortieren lassen und aussortierte und gepathte Filename dann in Listbox übertragen.
Wie ich da realisieren kann, weise ich noch nicht, werde Forum durchblättern und nach passenden Beispielen gucken.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datei Suche mit Listbox 
Autor: Manfred X
Datum: 17.12.14 10:09

Drücke Dich mal klarer aus!
Willst Du SORTIEREN oder FILTERN

Beides erledigt eine Bindingsource.

Ersetze in obigen Beispiel die Zeilen
lboFiles.DisplayMember = Filetable.Columns(0).ColumnName
lboFiles.DataSource = Filetable
durch
Dim bsFiles As New BindingSource
bsFiles.DataSource = Filetable
 
lboFiles.DisplayMember = "FileName"
lboFiles.DataSource = bsFiles
 
bsFiles.Sort = "FileName ASC"  'Sortierspalte(n) und Richtung angeben
'bsFiles.Filter Filterkriterium angeben
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datei Suche mit Listbox 
Autor: alex-fw
Datum: 17.12.14 10:17

Manfred,

nach Namen Sortieren.

Ganz ehrlich, das ist alles tool, nun mal wie ich die zwei coden zusammen verbinde, oder in ein bastele, weise und verstehe ich erstmal nicht.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Datei Suche mit Listbox 
Autor: Manfred X
Datum: 17.12.14 10:39

Da gibt es nicht viel zu basteln.

Angenommen, die Verzeichnisse "C:\xxxx" und "C:\yyyy" seien zu durchsuchen
und zwar jeweils nach den Suchmustern "*.jpg" und "*.png", wobei die gefundenen
Dateinamen ansteigend sortiert in der Listbox "lboFiles" stehen sollen

FilesToListbox(lboFiles, {"C:\xxxx", "C:\yyyy"}, {"*.jpg", "*png"})
Die geschweiften Klammern in der Parameterliste erstellen jeweils ein Array aus den
gegebenen Strings - ab VB 2010.
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