Listview durchsuchen

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

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Listview durchsuchen

    Ich versuche in meine Listview eine Suche zu machen, jedoch ohne Erfolg.
    Ich vermute man regelt es mit For each und einem contains und dann dem leeren der Listview und dem neuen hinzufügen der passenden Items.
    Alle Items und subitems sind abgespeichert in einer .txt Datei.
    So:
    ◙Info1◘Info2◘Info3◘Info4◘Info5◘
    ◙2Info1◘2Info2◘2Info3◘2Info4◘2Info5◘
    ◙3Info1◘3Info2◘3Info3◘3Info4◘3Info5◘

    Sobald der Text der Suchbox(TextBox) geändert wird, sollen nur die Zeilen übrig bleiben, die das was in der Suchbox steht, enthalten.

    Kann man sowas aus der Datei auslesen mit einem StreamReader?
    @kingsunil2000
    1. Nimm ein DataGridView, da kannst Du mit Row und Col auf die Zellen zugreifen.
    2. Bei kleinen Dateien lies sie per IO.File.ReadAllLines(...) in ein Array ein
    3. Bei größeren Dateien mach es so:

      VB.NET-Quellcode

      1. For Each line In IO.File.ReadLines("DATEI")
      2. ' was mit line machen
      3. Next


    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!
    Ich habe es mal so versucht:

    VB.NET-Quellcode

    1. Dim suchwort As String = TextBox1.Text
    2. For Each line In IO.File.ReadLines("C:\Test.txt")
    3. Dim items As String = line.Split(Convert.ToChar("◙"))(1)
    4. If line.ToLower.Contains(suchwort.ToLower) Then
    5. ListView1.Items.Clear()
    6. ListView1.Items.Add(line)
    7. Dim subitems As New List(Of String)
    8. For Each subitem As String In items.Split(Convert.ToChar("◘"))
    9. subitems.Add(subitem)
    10. Next
    11. End If
    12. Next


    Es macht es leider nicht wie ich es will.
    Die items werden nicht verteilt und außerdem wird nur eins angezeigt.

    P.S. Ich steige ungern auf ein DataGridView um.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „kingsunil2000“ ()

    kingsunil2000 schrieb:

    Es macht es leider nicht wie ich es will.
    Setze einen Haltepunkt auf Zeile 6 und überzeuge Dich davon, ob da das passiert, was Du meinst, was passieren soll. Gugst Du hier.
    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!
    Der Forumeintrag vom Link hilft mir nicht.
    Das Item wird ja gesplittet, jedoch die Subitems nicht und außerdem verstehe ich einfach nicht wieso immer nur eine Zeile bei der Suche angezeigt wird.
    Nach dem Code sollte meiner Meinung nach wenigstens das funtionieren.
    Eine bitte am Rande und ein Hinweis.
    Die Bitte: Sprich bitte in vollständigen und ordentlichen Sätzen bzw. Beschreibe besser was du nicht verstehst oder nicht kannst.
    Ein Hinweis: du kriegst hier keinen fertig verwendbaren Code d.h. entweder du verstehst das was du tun möchtest oder fangst am besten bei den Grundlagen an.
    Der Hinweis von @RodFromGermany soll bedeuten das du den Fehler selber finden würdest wenn du wüsstest wie man mit dem Visual Studio umgeht bzw. wie man sein geschriebenes (bei dir kopiertes) Werk auf richtigkeit prüft.

    String.Split(Convert.ToChar("◘")) geht übrigens so String.Split("◘"c)
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.
    Nochmal von vorn.
    Option Strict On über class form1
    Dann habe ich eine Sub erstellt und diese sorgt dafür das die Text-Datei C:\Test.txt so durchsucht wird:

    Nun habe ich das Problem, dass immer nur ein Suchergebnis angezeigt wird, was einen praktisch dazu zwingt das ganze gesuchte Wort einzugeben.
    Und außerdem werden die Items nicht gesplittet.

    Also ich kriege es nicht hin, dass die gefundene Zeile in der Text-Datei sich in der Listview verteilt, also wird das ganze als Item ohne subitems angezeigt.
    Option Strict On steht über form1 und 2 anderen formen, die nichts mit form1 zu tuen haben.

    VB.NET-Quellcode

    1. Dim suchwort As String = TextBox1.Text
    2. For Each line In IO.File.ReadLines("C:\Test.txt")
    3. Dim items As String = line.Split(Convert.ToChar("◙"))(1)
    4. If line.ToLower.Contains(suchwort.ToLower) Then
    5. ListView1.Items.Clear()
    6. ListView1.Items.Add(line)
    7. Dim subitems As New List(Of String)
    8. For Each subitem As String In items.Split(Convert.ToChar("◘"))
    9. subitems.Add(subitem)
    10. Next
    11. End If
    12. Next

    Mir ist aufgefallen, dass wenn man Zeile 10-13 entfernt, sich nichts ändert.

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

    Ich bin meinem Ziel näher gekommen:

    VB.NET-Quellcode

    1. Dim suchwort As String = TextBox1.Text
    2. For Each line In IO.File.ReadLines("C:\Test.txt")
    3. If line.ToLower.Contains(suchwort.ToLower) Then
    4. Dim items As String = line.Split(Convert.ToChar("◙"))(1)
    5. Dim subitems As New List(Of String)
    6. For Each subitem As String In items.Split(Convert.ToChar("◘"))
    7. subitems.Add(subitem)
    8. Next
    9. ListView1.Items.Clear()
    10. With ListView1.Items.Add(subitems.Item(0))
    11. Dim count As Integer = 1
    12. Do Until count = subitems.Count - 1
    13. .SubItems.Add(subitems.Item(count))
    14. count += 1
    15. Loop
    16. End With
    17. End If
    18. Next


    Es wird nun endlich gesplittet!
    Aber ich kriege es immer noch nicht hin, dass nicht nur ein Suchergebnis angezeigt wird.

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

    Du könntest natürlich auch die RegEx benutzen, ich weiß aber, wie gut überhaupt dein VB.NET-Wissensstand ist. Mit den RegEx kannst du das ganze auch viel feiner einstellen, wie und wo es gesplittet werden soll. Such mal hier im Forum danach.

    kingsunil2000 schrieb:

    VB.NET-Quellcode

    1. Convert.ToChar("◘")
    Machst Du "◘"c
    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!
    @kingsunil2000
    In deinem Code ist eine Zeile, die da nicht hingehört. Wie RodFromGermany schon gesagt hat, setz dir einfach mal einen Haltepunkt und geh Zeile für Zeile durch und guck, was passiert.
    Mfg
    Vincent

    @kingsunil2000
    Ja, das weiß ich und alle, die diesen Thread lesen, weil es einfach zu offensichtlich ist, was du falsch machst. Würdest du einfach mal das machen, ich und Rod gesagt haben, hättest du den Fehler schon lange gefunden.

    Du sollst dir übrigens einen Haltepunkt setzten, keine Zeile löschen. Da ich denke, dass du nicht weißt, wie man das macht, hier eine Anleitung:

    Als erstes klickst du rechts neben die erste Zeile deines Codes:



    oder du gehst in die Zeile und drückst F9, sodass es so aussieht:



    Jetzt drückst du F5 und suchst was (zum Test). Nun wird dein Programm pausiert und du kannst mit F10 immer eine Zeile weiter. Wenn du mit dem Cursor irgendwo drüber fährst, dann siehst du genauere Informationen über das Objekt (Interessant wäre ListView1.Items). Du kannst auch einen Rechtsklick auf das Wort ListView1 machen und dann auf "Überwachung hinzufügen" gehen. Dann ist unten rechts in dem Fenster das Objekt. Mit F5 kannst du das Debuggen übrigens wieder Fortsetzten.
    Mfg
    Vincent