Einträge aus mehreren List(Of String) löschen

  • VB.NET

Es gibt 31 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Einträge aus mehreren List(Of String) löschen

    Mahlzeit,

    folgendes Problem, ich schreibe in eine List(of String) per InputBox eine Überschrift und über eine Textbox in eine andere List(of String) einen normalen Text, dieser Text wird wiederum in einer .txt Datei gespeichert, dies passiert auch gleichzeitig damit beide den gleichen Index haben. Möchte ich diese .txt Datei nun über meinen löschen Button löschen, wird die Datei auch gelöscht, allerdings wollen meine Schleifen nicht wirklich den "dazugehörigen" Index in den List(of String) löschen. In dem momentanen Stand werden 2 Überschriften aber kein Text gelöscht.


    VB.NET-Quellcode

    1. 'Button zum löschen der ausgewählten Datei in der ListBox
    2. PublicSub btnTabelleLoeschen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTabelleLoeschen.Click
    3. 'Schleife um die in der CheckedListBox ausgewählte Datei zu löschen
    4. ForEach sDatei AsFileInfoIn lbTabelle.CheckedItems
    5. If String.Compare(sDatei.ToString, sTabellenUeberschrift) = True Then
    6. System.IO.File.Delete(Path.Combine(sThemenpfad, sDatei.ToString))
    7. For x AsInteger = 0 To listAusgabeUeberschrift.Count - 1
    8. listAusgabeUeberschrift.Remove(x)
    9. Next
    10. For y AsInteger = 0 To listAusgabeText.Count - 1
    11. listAusgabeText.Remove(y)
    12. Next
    13. Else
    14. MsgBox("GEHT NICHT")
    15. EndIf
    16. Next
    17. 'Aufruf der Methode um die CheckedListBox zu aktualisieren
    18. CrbFuellen()
    19. EndSub


    schönes Wochenende!

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Sportline“ ()

    @Sportline:
    würde ich dir raten das ganze in einem Dictionary anzulegen...
    So isses.

    VB.NET-Quellcode

    1. Dim dct As Dictionary = New Dictionary(Of String, String)
    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!
    also ich sehe da noch mehr als nur 2 STrings, die zusammengehören. Da scheint noch ein Dateipfad zu existieren, odr?

    Also für mich sind das Datensätze mit den Spalten "Header", "Text", "Path", und da würdich gleich mal wieder mit DB-Programmierung ohne Datenbank drauf losgehen.

    Dann holt man nämlcih den angewählten Datensatz aus der bindingSource, und löscht den Pfad, und dann den Datensatz selbst.
    Eigentlich würde ja eine einfache liste reichen, weil DirectoryInfo.GetFiles() ja die Fileinfo soviele Dinge bereitstellt, dass ich ja garkein verschiedenen sachen brauch!
    ICh speicher nen File ab, mit Namen "132654" geb dem als "eigenschaft" die Überschrift mit und speicher darin den Text ab...
    Ergo hab ich ja nur ne List(of FileInfo)
    Wie @ErfinderDesRades: ja so schön in seinem Thread dargelegt hat.
    Da kann ich ja dann je nach erfordernis das gewünschte Anzeigen ;)
    Eben. Oder Du erstellst halt deine List(Of T) mit einer Structure.

    Eine andere Möglichkeit wäre mit Splitchar.

    Deine List(Of String) könnte so aufgebaut sein:

    VB.NET-Quellcode

    1. 1.Überschrift & VbNullChar & Text
    2. 2.Überschrift & VbNullChar & Text


    Dann splittest Du eben immer nach vbNullchar.

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

    Guten Morgen,

    Dictionary habe ich probiert führte aber zu dem selben negativen Ergebnis wie List(Of String), aber wie dem auch sei erscheint mir die List(Of FileInfo) wesentlich flexibler.
    Ich habe die CheckedListBox durch eine ListBox ersetzt und die FileInfos erfolgreich wie von EDR erklärt hineingeladen.

    VB.NET-Quellcode

    1. Dim diPfad As New DirectoryInfo(sThemenpfad)
    2. Dim fiInhalt As FileInfo()
    3. fiInhalt = diPfad.GetFiles()
    4. clbDateien.DataSource = fiInhalt


    Frage ist nun, wie übergeb ich die Überschrift als "Eigenschaft" und wie speichere ich den Textdateiinhalt dahinter? Entweder ist es zu früh am Montag und ich übersehe das bei EDRs Post oder ich steig da nicht so wirklich durch ?(
    was meinst du mit "EDRs Post"? Post#4 oder das in post#5 verlinkte Tut?

    Weil das Tut mit der File-Listbox haut imo in deim Fall nicht hin, weil Überschrift nunmal keine Eigenschaft von FileInfo ist.
    also post#4 schlägt etwas völlig anneres vor, nämlich dass du dir Datensätze selbst erstellst. Die kannstedann mit den notwendigen Eigenschaften ausstatten (und laden und speichern und filtern und sortieren und Löschen ist alles gleich mit drin)
    Frage nebenbei, wenn ich nun ein Item aus der ListBox löschen möchte, wie kann ich für das Item die Datasource entbinden? Logischerweise läst er mich das Item so ja nicht löschen. Die Datasource auf "" oder null setzen funktioniert ja sicherlich nicht
    Bin nun nochmal zur Dictionary Variante zurück gekehrt. Klappt auch soweit, außer das er beim löschen alle Einträge außer den letzten entfernt

    VB.NET-Quellcode

    1. If String.Compare(clbDateien.SelectedItem.ToString(), sTabellenUeberschrift) = True Then
    2. For x As Integer = 0 To dct.Count - 1
    3. dct.Remove(x)
    4. Next
    5. Else
    6. MsgBox("Geht nicht")
    7. End If
    8. DirectCast(clbDateien.SelectedItem, FileInfo).Delete()


    Ich denke mal es liegt an der Schleife, frage ist nun, wo genau in der Schleife zwickt's?
    Nein, nicht alles löschen, denn könnt ich mir den Spaß mit Schleifen, etc ja sparen....

    Ich erstelle über eine Textbox eine .txt Datei welcher per Inputbox ein Name zugewiesen wird. Der Text aus der .txt Datei wird in ein html code eingesetzt, welcher so als Dictionary Value (sTabelleninhalt) gespeichert wird und der Name der .txt als Dictionary Key (sTabellenUeberschrift). Die erstellten .txt Dateien werden mir als Fileinfo in einer Listbox (clbDateien) angezeigt. Auf Knopfdruck lösche ich nun die .txt Datei, funktioniert auch, wird aus dem Pfad und aus der Listbox gelöscht. Nun möchte ich das die Einträge die zu der gelöschten .txt Datei gehören auch aus dem Dictionary gelöscht werden :)
    Leg dir lieber mal ne richtige Datenstruktur an.

    Wenn zwei Dinge zusammengehören, dann nimm ein Dictionary um die Dinge zusammen zu binden.

    Beispiel:

    VB.NET-Quellcode

    1. dim MyFiles as new Dictionary(of String, FileInfo)
    2. MyFiles.Add("Name der Datei",New FileInfo("Pfad zur Datei"))


    brauchst du alle namen, nimmst du:

    VB.NET-Quellcode

    1. MyFiles.Keys.ToList()


    willst du was löschen, dann schreibst du:

    VB.NET-Quellcode

    1. MyFiles.Remove("Name der Datei")


    Dann hängt beides zusammen.

    Zum löschen einer Datei und entfernen des eintrags kannst du folgendes verwenden.

    VB.NET-Quellcode

    1. Friend MyFiles As New Dictionary(Of String, FileInfo)
    2. Public Sub DeleteFile(ByVal FileName As String)
    3. If Not MyFiles.ContainsKey(FileName) Then
    4. Throw New ArgumentException("Datei nicht in Bibliothek vorhanden!", "FileName")
    5. Exit Sub
    6. Else
    7. MyFiles(FileName).Delete()
    8. MyFiles.Remove(FileName)
    9. End If
    10. End Sub


    Den Spaß mit den Schleifen kannst du dir in diesem Fall sowieso sparen, wenn du alles richtig anlegst.
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D
    Definitv Nachvollziehbar, ist auch super wenn ich den Namen der Datei und den dazugehörigen Pfad zusammen habe, aber was mach ich dann mit dem Inhalt der Textdatei der in meinem html code steht? Der "hängt" dann ja wieder außen vor. Da bräuchte ich dann ja quasi nen Dictionary mit einem key und zwei values.
    1. gibt es sowas wie Tuple(of ...)
    2. schau dir mal die FileInfo Klasse genauer an. Wozu denn den namen und den Pfad einer Datei in nem Dictionary speichern, wenn die Fileninfo beides beinhaltet? Vielleicht dann lieber ein Dictionary(of Fileinfo, string(dateiinhlat)) Wobei auch das wenig sin macht... nimm ne List(of Fileinfo) da kannste dann abhänig immer anzeigen(Pfad/ Name) un den Inhalt der datei laden/ speichern/ ändern/ whoatever...
    Gugge mal hier rein....

    VB.NET-Quellcode

    1. Public Class Information
    2. Public Property Info as FileInfo
    3. Public Property Zusatz as String
    4. Public Sub New(ByVal FileName as String, ByVal Zusatz as String)
    5. Me.Info = new FileInfo(Filename)
    6. Me.Zusatz = Zusatz
    7. End Sub
    8. End Class


    Schau dir lieber noch mal die Basics an. Wie man Klassen erstellt usw...
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D

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