Die in einer ListBox angezeiten Dateien löschen

  • .NET (FX) 4.5–4.8
  • VB.NET

Es gibt 86 Antworten in diesem Thema. Der letzte Beitrag () ist von MichaHo.

    Erstmal Danke für deine Hilfe und deine Geduld mit mir :thumbup:

    Ich habe jetzt mal unabhängig von der Löschfunktion mich nur auf das befühlen der ListBox konzentriert, leider wird bei beiden Quellcode die ListBox nicht befühlt. Bei dem ersten Quellcode wird sie nur über die Browser und die Auswahl des Ordner befühlt. Bei dem zweiten Quellcode wird gar nicht in der ListBox angezeigt. Zur Sicherheit habe ich den Quellcode in einer neuen Form eingebastelt, es kommt nicht mal eine Fehlmeldung.
    Das schlimme an der Angelegenheit ist, dass ich zwischendurch das Gefühl hatte, ich hätte es Verstanden :D .

    Hast du den Code von @Fakiz denn verstanden oder einfach nur kopiert?
    Ja, ich habe am Anfang nur kopiert. Natürlich versuche ich es wehren dessen ich damit arbeite, es zu verstehen. Aus meiner Sicht ist es sehr hilfreich ein Beispielcode zu haben um sich anschließend an das Thema heran zu tasten.

    Gruß und einen schönen Rest Sonntag Euch, ich werde morgen in aller Frische noch mal Probieren.
    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „knuepel“ ()

    Dann poste doch einmal was du nun hast bzw. wie du es umgesetzt hast.

    OT:

    knuepel schrieb:

    Aus meiner Sicht ist es sehr hilfreich ein Beispielcode zu haben um sich anschließend an das Thema heran zu tasten.

    Das sehe ich genau so. Zu Beginn habe ich das genau so gemacht erst später habe ich mich dann mit Lektüren eingedeckt.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Fakiz“ ()

    knuepel schrieb:

    Das schlimme an der Angelegenheit ist, dass ich zwischendurch das Gefühl hatte, ich hätte es Verstanden :D .


    Kopf hoch. Das Gefühl kennen wir alle ;) Zeig mal was du hast, wir helfen dir dann wieder in die richtige Richtung.

    Und ja, ohne Beispielcode lernen ist übel. Wenn du dann dessen Funktionsweise durchgehst und idealerweise auch nachvollziehen kannst was warum passiert, ist alles gut :)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    knuepel schrieb:

    Kann ich auch in der CombBox auch nur den Dateinamen anzeigen lassen, oder müssen die Einträge mit Pfad eingeben werden?
    Erstell ein neues Projekt.
    Füge diesem 3 Button und eine ListBox hinzu.
    Füge diesen Code ein und führe ihn aus. Drück nacheinander auf alle Button.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Dim fi() As IO.FileInfo = New IO.DirectoryInfo("c:\temp").GetFiles("*.*", IO.SearchOption.TopDirectoryOnly)
    4. Me.ListBox1.DataSource = fi
    5. Me.ListBox1.DisplayMember = "Name"
    6. End Sub
    7. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    8. Me.ListBox1.DisplayMember = "Name"
    9. End Sub
    10. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    11. Me.ListBox1.DisplayMember = "FullName"
    12. End Sub
    13. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    14. Me.ListBox1.DisplayMember = "DirectoryName"
    15. End Sub
    16. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    mrMo schrieb:

    Dann musst du mit DisplayMember und ValueMember arbeiten.
    Dazu muss aber erst eine entsprechende Klassenstruktur angelegt und eine Liste mit Einträgen erstellt werden, welche die Daten beinhalten. Oder alternativ eine Listen von FileInfo Einträgen. Dann kannst du das Binding auf Path stellen

    Keef schrieb:

    in einem Stringarray speichern
    Siehe oben
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Hallo zusammen,

    leider war ich fast eine Woche gesundheitlich Angeschlagen und konnte nicht weiter basteln. Seit Freitag geht es mir besser und nun möchte ich es weiter versuchen und verstehen, ich hoffe ihr werdet mich dabei unterstützen.

    Radinator schrieb:

    Dann musst du mit DisplayMember und ValueMember arbeiten.Dazu muss aber erst eine entsprechende Klassenstruktur angelegt und eine Liste mit Einträgen erstellt werden, welche die Daten beinhalten. Oder alternativ eine Listen von FileInfo Einträgen. Dann kannst du das Binding auf Path stellen


    Kannst du oder jemand anders ein Beispiel geben?
    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(
    Schau dir diesen wunderbaren Artikel von @ErfinderDesRades an.
    Keine Strings in die File-Listbox!

    Und schau dir auch den Beitrag von @RodFromGermany etwas weiter oben an. Den hast du sogar als hilfreich markiert ;)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    mrMo schrieb:

    Und schau dir auch den Beitrag von @RodFromGermany etwas weiter oben an. Den hast du sogar als hilfreich markiert


    Das mit unterschiedlichen angezeigten Möglichkeiten habe ich Verstanden, aber leider verstehe ich es nicht wo die Information mit den Pfad eingebaut werden muss.
    Wenn ich das Beispiel vom Fakiz mit der ListBox nehme dann verstehe ich folgendes:
    • ListBox1.DisplayMember = "Name": hier wird in der ListBox nur der Datei Name angezeigt.
    • ListBox1.ValueMember = "FullName": hier bezieht sich die Löschfunktion
    ​Das ist doch richtig oder?
    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(
    Ausprobiert habe ich es und es funktioniert auch, es steht nur der Dateiname in der List Box und gelöscht wir die Datei trotzdem. Ich glaube es auch verstanden zu haben :) .

    Aber:
    die Datei wird durch folgenden Code in der ListBox geladen:

    Quellcode

    1. ​Private Sub loadContent_Click(sender As Object, e As EventArgs) Handles loadContent.Click
    2. Using fb As New FolderBrowserDialog()
    3. If fb.ShowDialog() = DialogResult.OK Then
    4. LoadFolderContent(fb.SelectedPath)
    5. End If
    6. End Using
    7. End Sub


    hierbei öffnet sich der Explorer (FolderBrowserDialog) und der entsprechende Ordner muss gesucht werden.
    Hier wäre es schon wenn die Ordner aus einer ComboBox kommen und das bekommen ich nicht hin.
    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(
    Ich verstehe nicht ganz was genau machen möchtest...
    Erklär mir bitte genau was du wie machen möchtest.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Ich versuch mal zu Beschreiben
    • eine ComboBox wo nur der Ordner Name ausgewählt werden kann (Beispiel: D:\Test1 und D:Test2 wird nur in der ComboBox als Test1 oder Test2 angezeigt)
    • eine ListBox, hier soll nach Button1 druck der nur Datei Name erscheinen. (Beispiel: in D:\Test1 befindet sich die Datei Apfel und in D:\Test2 befindet sich die Datei Birne. Durch den Button1 druck und Auswahl Test1 in der ComboBox, wird in der ListBox der Datei Name Apfel angezeigt. Bei Auswahl Test2 in der ComboBox und Button1 druck wird in der ListBox der Datei Name Birne angezeigt).
    • Löschen durch Button2 druck, hier sollen die Datei/en gelöscht werden, die in der ListBox stehen. (Beispiel: ComboBox Auswahl steht auf Test2, nach Button1 druck erscheint in der ListBox der Datei Name Birne. Jetzt soll nach Button2 druck der Ordner Test2 geleert werden, also Datei Birne ist gelöscht. Bei Auswahl in der ComboBox Test1 wird Datei Apfel gelöscht.
    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(
    ComboBox -Beispiel

    Sowohl eine ListBox als auch eine ComboBox verfügen über Komplexe Datenbindung. Das heisst du kannst mittels der Eigenschaft DataSource ein Array eines bestimmten Daten -Typs binden. In deinem Fall wäre das ein Array vom Typ FileInfo, ein FileInfo -Objekt besitzt unter anderem die öffentlichen Eigenschaften FullName und Name die du ja bereits beide kennen solltest. Wie du ja bereits festgestellt hast kannst du mit der Eigenschaft DisplayMember festlegen welche Eigenschaft in einer ListBox oder ComboBox angezeigt werden soll.
    Wenn du dir nun das FileInfo -Objekt ansiehst wirst du feststellen das es z.B. auch die öffentliche Eigenschaft Extension gibt, diese eigenschft gibt dir die Dateierweiterung zurück. Das wäre z.B. .exe, .png, .bmp, ect wählst du nun den DisplayMember Extension dann würden dir in der ListBox an stelle der Dateinamen die Dateierweiterungen angezeigt.

    Mit der Eigenschaft ValueMember kannst du den Wert des DisplayMember festlegen. Diesen Wert kannst du nun im SelectedValueChanged Event des jeweiligen Steuerelementes abrufen.

    VB.NET-Quellcode

    1. Private Sub comboBox1_SelectedValueChanged(sender As Object, e As EventArgs)
    2. End Sub


    Da du auf den Pfad der jeweiligen Datei zugreifen willst musst du als ValueMember die Eigenschaft FullName des FileInfo -Objekts wählen, da diese Eigenschaft den Absoluten Pfad der Datei repräsentiert.
    Nun verstehe ich folgendes, ist das richtig?

    die ComboBox braucht also die Daten Anbindung (An Daten gebundene Elemente ...), aus der Daten Anbindung kommt die Info, dass bei das bei ComboBox Auswahl Test1 der Pfad D:\Test1 ausgewählt ist.

    hier ist die benötige Daten Anbindung bei meiner ComboBox

    ComboBox1.DataSource = New DirectoryInfo(fb.SelectedPath).GetDirectories()
    ComboBox1.DisplayMember = "Test1"
    ComboBox1.ValueMember = "D:\Test1"

    aber wie kann ich diese anbinden, muss ich eine Klasse hinzufügen?
    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „knuepel“ ()

    Du erstellst dir eine List(Of FileInfo).

    VB.NET-Quellcode

    1. Dim lstDateien As New List(Of FileInfo)


    Diese Liste befüllst du mit deinen Dateien

    VB.NET-Quellcode

    1. Dim di As New DirectoryInfo(ofd.SelectedPath)
    2. lstDateien.AddRange(di.GetFiles("*.*", SearchOption.TopDirectoryOnly))


    aber wie kann ich diese anbinden?

    Dann bindest du die Liste an deine Combobox.

    VB.NET-Quellcode

    1. cmbDateien.DataSource = lstDateien


    Am Ende gibst du noch an was DisplayMember und was ValueMember ist.
    aber nicht so
    ComboBox1.DisplayMember = "Test1"
    ComboBox1.ValueMember = "D:\Test1"

    Sondern so:

    VB.NET-Quellcode

    1. cmbDateien.DisplayMember = "Name"
    2. cmbDateien.ValueMember = "FullName"


    Das kann dann so aussehen (ohne Prüfungen ob Dateien/Leserechte/Schreibrechte/sonstiges vorhanden ist):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Dim lstDateien As New List(Of FileInfo)
    4. Private Sub cmdWaehlen_Click(sender As Object, e As EventArgs) Handles cmdWaehlen.Click
    5. Dim ofd As New FolderBrowserDialog()
    6. ofd.ShowDialog()
    7. If (Not ofd.SelectedPath = "") Then
    8. Dim di As New DirectoryInfo(ofd.SelectedPath)
    9. lstDateien.AddRange(di.GetFiles("*.*", SearchOption.TopDirectoryOnly))
    10. cmbDateien.DataSource = lstDateien
    11. cmbDateien.DisplayMember = "Name"
    12. cmbDateien.ValueMember = "FullName"
    13. End If
    14. End Sub
    15. Private Sub cmdLoeschen_Click(sender As Object, e As EventArgs) Handles cmdLoeschen.Click
    16. If (Not cmbDateien.SelectedIndex = -1) Then
    17. File.Delete(cmbDateien.SelectedValue.ToString())
    18. End If
    19. End Sub
    20. End Class


    Edit: 1000 Schreibfehler korrigiert ;)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „mrMo“ ()

    Hallo mrMo,

    irgendwie bekomme ich es nicht hin, kannst du mal bitte drüber schauen?

    VB.NET-Quellcode

    1. ​Imports System.IO
    2. Public Class Form1
    3. Dim lstDateien As New List(Of FileInfo)
    4. Private Property cmbDateien As Object
    5. Private Sub cmdWaehlen_Click(sender As Object, e As EventArgs) Handles cmdWaehlen.Click
    6. Dim ofd As New FolderBrowserDialog()
    7. ofd.ShowDialog()
    8. If (Not ofd.SelectedPath = "") Then
    9. Dim di As New DirectoryInfo(ofd.SelectedPath)
    10. lstDateien.AddRange(di.GetFiles("*.*", SearchOption.TopDirectoryOnly))
    11. cmbDateien.DataSource = lstDateien
    12. cmbDateien.DisplayMember = "Test1"
    13. cmbDateien.ValueMember = "D:\Test1"
    14. End If
    15. End Sub
    16. Private Sub LoadFolderContent(path As String)
    17. Dim di As New System.IO.DirectoryInfo(path)
    18. If di.Exists Then
    19. listBox1.Items.Clear()
    20. listBox1.Items.AddRange(di.GetFiles())
    21. listBox1.DisplayMember = "Name"
    22. End If
    23. End Sub
    24. Private Sub cmdLoeschen_Click(sender As Object, e As EventArgs) Handles cmdLoeschen.Click
    25. If (Not cmbDateien.SelectedIndex = -1) Then
    26. File.Delete(cmbDateien.SelectedValue.ToString())
    27. End If
    28. End Sub
    29. End Class
    ich bin ein Anfänger, bitte habt Verständnis für meine Unwissenheit und eventuelle schlecht gestellte Fragen ?(
    @mrMo der Ansatz ist Käse, warum eine Generische Liste verwenden wenn die Daten bereits als Array vorliegen?

    @knuepel
    Die Methode GetDirectories() gibt dir ein Array mit DirectoryInfo -Objekten eines Ordners zurück. Jedes dieser DirectoryInfo -Objekte steht dabei für einen Ordner im Root Ordner. Nehmen wir an du hast einen Ordner Test_Root in diesem Ordner befinden sich nun die Ordner SubFolder1 und SubFolder2.

    Wenn du nun
    ComboBox1.DataSource = New DirectoryInfo(Test_Root).GetDirectories()
    aufrufst wird der CoboBox ein DirectoryInfo Array übergeben. In diesem Array befinden sich nun 2 DirectoryInfo -Objekte. Eines dieser Objekte steht für SubFolder1 und das andere für SubFolder2.

    Nun kommt die Magie ins Spiel, für die DataSource ist dieses Array zunächst "object" und es wird nun geprüft welche Felder sich in diesem Objekt befinden (falls du einen tieferen einblick in die Komplexe Datenbindung haben willst kannst du dir die DataListView aus dem Showroom angucken. Dort habe ich das umgesetzt und man sieht wie die DataSource die daten verarbeitet). Da ein DirectoryInfo eben die öffentlich Eigenschaften Name (Der Name des Ordners also SubFolder1 oder SubFolder2) und FullName (Der Pfad des Ordners also c:\Test_Root\SubFolder1) beinhaltet kann man diese beiden Eigenschaften direkt auslesen. In dem man den Namen der Eigenschaft als ValuMember oder DisplayMember angibt. Naturlich kannst du auch alle anderen öffentlichen Eigenschaften verwenden.

    PS: Hier wäre noch mal etwas deutlicher wie bzw. warum du als DisplayMember "Name" eintragen musst.


    Wie du auf dem Bild siehst repräsentiert die Eigenschaft Name den Namen der Datei. Und du willst ja den Namen der Datei/Ordner angezeigt bekommen.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs)
    2. 'Using fb As New FolderBrowserDialog()
    3. 'If fb.ShowDialog() = DialogResult.OK Then
    4. comboBox1.DataSource = New DirectoryInfo("D:\Test1").GetDirectories()
    5. comboBox1.DisplayMember = "Name"
    6. comboBox1.ValueMember = "FullName"
    7. 'End If
    8. 'End Using
    9. End Sub
    10. Private Sub comboBox1_SelectedValueChanged(sender As Object, e As EventArgs)
    11. LoadFolderContent(comboBox1.SelectedValue.ToString())
    12. End Sub
    13. Private Sub LoadFolderContent(path As String)
    14. Dim di As New System.IO.DirectoryInfo(path)
    15. If di.Exists Then
    16. listBox1.Items.Clear()
    17. listBox1.Items.AddRange(di.GetFiles())
    18. listBox1.DisplayMember = "Name"
    19. End If
    20. End Sub

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Fakiz“ ()

    Fakiz schrieb:

    der Ansatz ist Käse, warum eine Generische Liste verwenden wenn die Daten bereits als Array vorliegen?

    Berechtigte Frage, ehrlich gesagt bin ich bei meinem Post mit den Controls durcheinander gekommen. Die List(Of FileInfo) braucht er erst in der ListBox.

    Ich glaube, hier gab es nun so viele Erklärungsversuche, Links zu Tutorials etc. hier mal ein Ansatz wie man es machen könnte (nicht muss). Vielleicht kann der TE ( @knuepel Bitte nicht einfach kopieren und fertig) damit nachvollziehen was wo passiert.
    Achtung: Alles ohne Netz und doppelten Boden (einfach nur "nackter" Code zum nachvollziehen)
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Hier war mal Code ;-)



    EDIT: Code doch nochmal entfernt, weil @Fakiz das Thema oben sehr schön erklärt hat.

    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „mrMo“ ()