Listbox einträge kürzen und "puffern"

  • VB.NET

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von lokue.

    Listbox einträge kürzen und "puffern"

    Hey, ich habe ein Problem.

    Ich durchsuche mit sPath Befehl einen bestimmten Ordner nach .doc Datei.
    Diese werden danach in einer Listbox aufgelistet.

    Leider ist mir der Angezeigte Pfad zu lang, weil ich möchte nun einfach nur die Dateinamen nach Alphabet ordnen möchte.

    In der Listbox sehen die Einträge denn so bei mir aus :

    Quellcode

    1. ListBox1.Items.add("Z:\Formulare HL\_alt\Allgemein\Gesprächs-u.Telefonnotiz.doc")
    2. ListBox1.Items.add("Z:\Formulare HL\_alt\Allgemein\ToDo-List.xls")
    3. 'uvm .. über 500 Dateien


    Kann man die Einträge so Filtern, dass dort nur noch z.B. "ToDo-List.xls" drinn steht?

    Problem ist, ich brauche den ganzen Pfad ja noch für ein commandButton. Der öffnet dann die Datei. Wenn der Pfad in der Listbox vershwindet und nur noch der Dateiname ist, findet der Button ja nichts mehr ?(
    Bilder
    • bi.JPG

      90,25 kB, 973×652, 222 mal angesehen
    Hey,

    lokue schrieb:

    Kann man die Einträge so Filtern, dass dort nur noch z.B. "ToDo-List.xls" drinn steht?

    schau dir dazu mal folgende Methode an:

    VB.NET-Quellcode

    1. ' Den Dateinamen (mit Dateiendung) in einer String-Variablen ablegen:
    2. Dim _kurz As String = IO.Path.GetFileName("G:\Test\Deine_Datei.mp3")

    'GetFileName()' gibt dir nur den Dateinamen zurück. Diesen dann einfach der Listbox hinzufügen. Den Pfad zum Ordner legst du dir ebenfalls in einer Variablen ab und bei Bedarf setzt du das ganze wieder zusammen.

    Gruß, Manschula
    Hey,

    Grundüberlegung dahinter: vor dem Hinzufügen die Datei samt Pfad "zwischenspeichern/ablegen" und nur den Dateinamen in die Listbox aufnehmen. Bei einem Klick auf deinen CommandButton dann den "richtigen vollständigen" Pfad verwenden. Frage: ist eine Listbox für dieses Vorhaben überhaupt das richtige Control? Wäre eine Listview nicht sinnvoller?

    Gruß, Manschula
    Hey, Vielen Dank für die schnellen Antworten !

    Magst Du mir den Code dafür mal aufschreiben?
    Ich kann mich dort irgendwie nicht reindenken. Ich verstehe auch nicht ganz wie das funktionieren soll mit dem GetFileName programmiertechnisch.
    Muss ich da irgendeine schleife haben etc? ?( oh man ich bin gerade heftig am verzweifeln. 8o
    Mit diesem hier :)

    Quellcode

    1. Dim sFile As String
    2. Dim sPath As String
    3. ' Startverzeichnis
    4. 'sPath = Application.StartupPath
    5. sPath = "Z:\Formulare HL"
    6. ' ggf. abschließenden Backslash hinzufügen
    7. If Not sPath.EndsWith("\") Then sPath += "\"
    8. ' alle Doc-Dateien im Startverzeichnis einschl. Unterordner
    9. ' in einer ListBox anzeigen
    10. For Each sFile In My.Computer.FileSystem.GetFiles(sPath, FileIO.SearchOption.SearchAllSubDirectories, "*.doc")
    11. ' Dateiname mit relativer Pfadangabe zum Startverzeichnis ausgeben
    12. Form2.ListBox1.Items.Add(sFile.Substring(sPath.Length))
    13. Next


    und wegen dem Listview, das würde mich nun zusätzlich verwirren.
    Hey,

    in deinem Code fügst du mit dieser Zeile die gefundenen *.doc-Dateien zu deiner Listbox hinzu:

    VB.NET-Quellcode

    1. Form2.ListBox1.Items.Add(sFile.Substring(sPath.Length))

    Um nur den Dateinamen dieser Datei hinzuzufügen, musst du den Code von mir oben verwenden. Dieser gibt den Dateinamen ohne Pfad zurück. Bei dir muss das also wie folgt aussehen:

    VB.NET-Quellcode

    1. Form2.ListBox1.Items.Add(IO.Path.GetFileName(sfile))

    Es bleibt das Problem, dass du jetzt in der Listbox nur den Dateinamen hast. Willst du die Datei jetzt öffnen, fehlt dir dazu der Pfad zur Datei. Du musst dir also noch überlegen, wie du für jede Datei den Pfad "zwischen-speicherst".

    Gruß, Manschula
    Puh, also dass er nur den Dateinamen anzeigt funktioniert schonmal *wuhuuuuuu*

    Wenn ich nun die Datei über einen Button öffnen möchte könnte ich doch
    quasi gegenteiliges machen.



    So habe ich es vorher geregelt, bevor ich den Link noch nicht gekürzt hatte..

    Quellcode

    1. Process.Start("Z:\Formulare HL\" & ListBox1.SelectedItem)


    Meinst Du, ich könne das nun mit einem Array machen?..
    Hey,

    wieso mit einem Array? Problem ist doch, dass du nicht weißt, in welchem Unter-Unter-Unter-Ordner die Datei liegt. Deshalb musst du für jede Datei in irgendeiner Art und Weise den vollständigen Pfad "merken". Deswegen halte ich eine Listbox in diesem Fall für ungeeignet.

    Spoiler anzeigen
    Mal ein kurzes Beispiel, wie es mit einer Listview gehen könnte
    Code um die Dateien zu suchen und einzufügen:

    VB.NET-Quellcode

    1. Dim sfile As String = Nothing
    2. Dim sPath As String = "G:\Test\"
    3. For Each sFile In My.Computer.FileSystem.GetFiles(sPath, FileIO.SearchOption.SearchAllSubDirectories, "*.doc")
    4. ' Gefundene Datei zur Listview hinzufügen
    5. Dim _newItem As New ListViewItem
    6. With _newItem
    7. ' Der Dateiname wird angezeigt...
    8. .Text = IO.Path.GetFileName(sfile)
    9. ' ...und der vollständige Pfad in der 'Tag-' Eigenschaft "gespeichert"
    10. .Tag = sfile
    11. End With
    12. ListView1.Items.Add(_newItem)
    13. Next


    Code für das Starten der in der Listview markierten Datei:

    VB.NET-Quellcode

    1. ' Prüfen, ob überhaupt ein Eintrag ausgewählt wurde...
    2. If IsNothing(ListView1.FocusedItem) = False Then
    3. ' ...und diese Datei dann starten:
    4. Process.Start(ListView1.FocusedItem.Tag.ToString)
    5. End If

    Oder aber du speicherst den Pfad in einer Liste und suchst in nachher wieder raus. Zwei Möglichkeiten...

    Gruß, Manschula

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Manschula“ () aus folgendem Grund: Listview-Bsp. eingefügt

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim loPfade As New List(Of String)
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. Dim sFile, sPath As String
    5. lblDateiPfade.Text = ""
    6. ' Startverzeichnis
    7. 'sPath = Application.StartupPath
    8. sPath = "Z:\Formulare HL"
    9. ' ggf. abschließenden Backslash hinzufügen
    10. If Not sPath.EndsWith("\") Then sPath += "\"
    11. ' alle Doc-Dateien im Startverzeichnis einschl. Unterordner
    12. ' in einer ListBox anzeigen
    13. For Each sFile In My.Computer.FileSystem.GetFiles(sPath, FileIO.SearchOption.SearchAllSubDirectories, "*.doc")
    14. 'Dateinamen in Listbox
    15. lboDateiNamen.Items.Add(IO.Path.GetFileName(sFile))
    16. 'Pfade in List of
    17. loPfade.Add(sFile)
    18. Next
    19. End Sub
    20. Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lboDateiNamen.SelectedIndexChanged
    21. If lboDateiNamen.SelectedIndex = -1 Then Return 'Exception verhindert ^^
    22. lblDateiPfade.Text = loPfade.Item(lboDateiNamen.SelectedIndex) 'Lese den String aus der List of; Reihenfolge ist identisch mit Listbox
    23. End Sub
    24. End Class


    //Ui, war ich wieder langsam.. Aber immerhin beschäftigt.. :)
    Was das bezwecken soll?
    Die Listbox wird mit den Dateinamen gefüllt und eine List of mit den Pfaden. Wenn du auf einen Eintrag der Listbox klickst, wird der dazugehörige Pfad in einem Label ausgegeben. ... Oder du übergibst ihn an Process.Start, um das Dokument zu öffnen.

    //Edit

    loPfade.Sort() dürfte die List of String entsprechend sortieren. (Weiß es net, probier es mal aus^^)
    okay, also wenn ich richtig verstanden habe ist

    lblDateiPfade.Text ein Label ;)

    Gut, ich werde es Morgen ausprobiere. Mein Windows ist eben abgeschmiert und nun will er wieder fleißig Updates ziehen.
    Langsam hab ich heute echt die Schnauze voll :love:
    Ich werde Morgen Feedback geben :D

    Danke danke danke danke danke danke nochmals für eure Hilfe !!!
    Unglaublich Dankbar.

    Ich sitze schon seit 2 Wochen an diesem Programm und das war eins meiner schwierigsten Probleme.
    ;(
    Mein Vorschlag:

    VB.NET-Quellcode

    1. Option Strict On
    2. Public Class Form1
    3. Private FileListe As New List(Of System.IO.FileInfo)
    4. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    5. FileListe.Clear()
    6. For Each s As String In My.Computer.FileSystem.GetFiles(My.Computer.FileSystem.SpecialDirectories.MyDocuments)
    7. FileListe.Add(My.Computer.FileSystem.GetFileInfo(s))
    8. Next
    9. ListBox1.DisplayMember = "Name"
    10. ListBox1.ValueMember = "FullName"
    11. ListBox1.DataSource = FileListe
    12. End Sub
    13. Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
    14. If ListBox1.SelectedItem IsNot Nothing Then
    15. Dim fi As IO.FileInfo = DirectCast(ListBox1.SelectedItem, IO.FileInfo)
    16. Label1.Text = fi.FullName
    17. End If
    18. End Sub
    19. End Class
    Wieso braucht ihr alle soviel Zeilen?

    VB.NET-Quellcode

    1. Private Sub ListIt()
    2. Dim Pat As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "New")
    3. ListBox1.Items.AddRange(Directory.GetFiles(Pat).Where(Function(x) Path.GetFileName(x).EndsWith(".doc")).Select(Function(x) Path.GetFileName(x)).ToArray)
    4. End Sub



    Hab den Code auch "ein Wenig" gekürzt.

    AsdAsd1337 schrieb:

    Wieso braucht ihr alle soviel Zeilen?

    Weil eine List(Of FileInfo) als DatenContainer wesentlich mächtigere Möglichkeiten der Auswertung bereitstellt als eine Listbox mit Strings drinne.
    Siehe zB. Picoflops Listbox_SelectedIndexChanged.

    Das würdich übrigens ohne Cast gestalten

    VB.NET-Quellcode

    1. Private Sub ListBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) _
    2. Handles ListBox1.SelectedIndexChanged
    3. If ListBox1.Selectedindex < 0 Then Return
    4. Dim fi = FileListe(ListBox1.Selectedindex)
    5. Label1.Text = fi.Fullname
    6. Label2.Text = fi.Name
    7. Label3.Text = fi.Length.Tostring
    8. End Sub