| |
VB.NET - Ein- und UmsteigerDatei 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 | |
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.
| |
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.
| |
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?
| |
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 | |
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 | |
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.
| |
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.
| |
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 ....
| |
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.
| |
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 | |
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.
| |
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 | |
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.
| |
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.
| |
| 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 |
|
|
sevOutBar 4.0
Vertikale Menüleisten á la Outlook
Erstellen von Outlook ähnlichen Benutzer- interfaces - mit beliebig vielen Gruppen und Symboleinträgen. Moderner OfficeXP-Style mit Farbverläufen, Balloon-Tips, u.v.m. Weitere InfosTipp des Monats Access-Tools Vol.1
Über 400 MByte Inhalt
Mehr als 250 Access-Beispiele, 25 Add-Ins und ActiveX-Komponenten, 16 VB-Projekt inkl. Source, mehr als 320 Tipps & Tricks für Access und VB
Nur 24,95 EURWeitere Infos
|