Suche in Textbox mit mehreren Übereinstimmungen

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

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    Suche in Textbox mit mehreren Übereinstimmungen

    Hi

    Ich möchte gerne eine Suche programmieren. Ich gebe in Textbox1 das gesuchte wort ein und dieses wird dann über einen Button "Suchen" in der textbox2 gesucht. Falls es einen treffer gibt, wird zu dem wort gescrollt und dieses markiert. Wenn es mehrere Treffer gibt (Ich habe einen bottton mit Pfeil runter und einen mit einem Pfeil nach oben) möchte ich den nächsten treffer durch den Pfeil nach unten angezeigt bekommen und den vorherigen treffer durch den Pfeil nach oben.

    LG Calamann
    Bilder
    • Suche.PNG

      18 kB, 1.410×1.013, 124 mal angesehen

    VB.NET-Quellcode

    1. Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click
    2. Dim Suche As String
    3. Dim Gesucht As String
    4. Suche = TextBox2.Text
    5. Gesucht = InStr(TextBox1.Text, Suche)
    6. If Gesucht Then
    7. TextBox1.Focus()
    8. TextBox1.SelectionStart = Gesucht - 1
    9. TextBox1.SelectionLength = Len(Suche)
    10. TextBox1.ScrollToCaret()
    11. Else
    12. MsgBox("Keine Suchergebnisse.")
    13. End If
    14. End Sub


    Also er sucht jetzt schon und markiert das richtige Wort. Er scrollt auch schon zu der Auswahl hin. Mir fehlt jetzt aber noch, dass er auch mehrere Übereinstimmungen anzeigen kann, indem ich auf den Button mit dem Pfeil hoch/runter drücke um das nächste Ergebnis/ vorherige Ergebnis zu markieren.
    Dein Code hat eine Menge Leerzeilen, die kannst du alle einmal wegmachen.
    Option Strict auf On einstellen...
    Versuche einmal den Namespace Microsoft.VisualBasic aus den Verweisen zu entfernen.
    Dann läufst du nicht gleich in Gefahr alte Vb6-Funktionen (böse Funktionen) herzunehmen...
    Visual Studio - Empfohlene Einstellungen

    Ich habe aus deinen Code eine Vorwärtssuche mit nur einen Suchbutton gemacht...

    VB.NET-Quellcode

    1. Imports System.Environment
    2. Public Class Form1
    3. Private txtVorlage As New List(Of String) From {{"Hallo ich bin gerade dabei hier in der Textbox "},
    4. {"mehrere Textstellen zu selektieren... "},
    5. {"Leider geht das nicht so ohne Weiteres! "},
    6. {"Zumindest kann man mit gezeigten Code "},
    7. {"einen angegeben Suchstring suchen. "},
    8. {"Man braucht nur den SuchButton mehrmals drücken, "},
    9. {"bis die Vorwärtssuche kein Ergebnis mehr bringt... "},
    10. {"Man beachte auch das TextChanged-Ereignis bei Textbox für den Suchstring... "}}
    11. Private FindIndex As Integer
    12. Private TextString As String
    13. Private SuchString As String
    14. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    15. For Each txt In txtVorlage
    16. TextString &= String.Concat(txt, NewLine)
    17. Next
    18. tbxTextansicht.Text = TextString
    19. End Sub
    20. Private Sub btnSearch_Click(sender As Object, e As EventArgs) Handles btnSearch.Click
    21. SuchString = tbxPattern.Text
    22. FindIndex = TextString.IndexOf(SuchString, FindIndex)
    23. If FindIndex > 0 Then
    24. tbxTextansicht.Focus()
    25. tbxTextansicht.SelectionStart = FindIndex
    26. tbxTextansicht.SelectionLength = SuchString.Length
    27. tbxTextansicht.ScrollToCaret()
    28. FindIndex += SuchString.Length
    29. Else
    30. MessageBox.Show("Keine Suchergebnisse.")
    31. End If
    32. End Sub
    33. Private Sub tbxPattern_TextChanged(sender As Object, e As EventArgs) Handles tbxPattern.TextChanged
    34. FindIndex = 0
    35. End Sub
    36. End Class

    Die Rückwärtssuche schaut ähnlich aus...

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

    Ok hab ich gemacht;) Habe jetzt:

    VB.NET-Quellcode

    1. Imports System.Environment
    2. Public Class Form1
    3. Private FindIndex As Integer
    4. Private TextString As String
    5. Private SuchString As String
    6. Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click
    7. SuchString = TextBox2.Text
    8. FindIndex = TextString.IndexOf(SuchString, FindIndex, StringComparison.OrdinalIgnoreCase)
    9. If TextBox2.Text = "" Then
    10. MsgBox("Keine Suchergebnisse.")
    11. Else
    12. If FindIndex >= 0 Then
    13. TextBox1.Focus()
    14. TextBox1.SelectionStart = FindIndex
    15. TextBox1.SelectionLength = SuchString.Length
    16. TextBox1.ScrollToCaret()
    17. FindIndex += SuchString.Length
    18. Else
    19. MsgBox("Keine Suchergebnisse.")
    20. End If
    21. End If
    22. End Sub
    23. Private Sub Textbox2_TextChanged(sender As Object, e As EventArgs) Handles TextBox2.TextChanged
    24. FindIndex = 0
    25. End Sub
    26. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    27. For Each txt In TextBox1.Text
    28. TextString &= String.Concat(txt)
    29. Next
    30. TextBox1.Text = TextString
    31. End Sub
    32. End Class

    Jetzt funktioniert alles. Also nochmal vielen Dank VB1963 für die Hilfe;)

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

    Ja du hast sogar den Fehler in Zeile #25 meines Codes entdeckt :thumbsup:
    Trenne GUI von den Daten und frage bei Zeile #11 lieber den String TextString ab...
    Und du fragst den zu untersuchenden Text zu spät auf eine leere Länge ab
    und es wird eine Zeile davor in #10 eine NullReferenceException fliegen...
    Da könntest auch gleich den richtigen Grund "Es gibt keinen Text, wo man suchen kannn..." angeben...

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

    VB1963 schrieb:

    Trenne GUI von den Daten und frage bei Zeile #11 lieber den String TextString ab...
    Und du fragst den zu untersuchenden Text zu spät auf eine leere Länge ab
    und es wird eine Zeile davor in #10 eine NullReferenceException fliegen...
    Wie meinst du das? Also wenn ich in Zeile 11 für textbox2.text textstring einsetze, zeigt er mir keine msgbox an.

    VB1963 schrieb:

    Da könntest auch gleich den richtigen Grund "Es gibt keinen Text, wo man suchen kannn..." angeben...
    Ja ich wusste grad nicht wie ich das formulieren sollte ;)

    Calamann schrieb:

    Wie meinst du das? Also wenn ich in Zeile 11 für textbox2.text textstring einsetze, zeigt er mir keine msgbox an.
    Lass den Code erstmal wie er war, und überprüfe, ob vb1963's Annahme überhaupt richtig ist.
    Weil wenn er sich irrt, können deine Verbessrungen nur verschlimmbessern.

    Was mir hingegen gegen den Strich geht ist dieser Nonsense:

    VB.NET-Quellcode

    1. For Each txt In Textbox1.Text
    2. TextString &= String.Concat(txt)
    3. Next
    Die Textbox hat doch nur einen Text - was machst du da mit ForEach ?
    @Calamann
    Sorry, da habe ich leider den Suchstring mit dem Textstring in deinem Code verwechselt. :( (bei TextString="" kommt genannte Exception...)
    Und da sind wir auch schon bei der richtigen Benamung von Controls...macht den Code lesbarer!

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

    Dir Änderungsvorschläge zu machen ist nicht mein Primärziel.
    Viel wichtiger finde ich, dass du deinen Code verstehst (ändern wirst du ihn dann schon selber).

    in was ich als Nonsense bezeichne kommt eine Foreach-Schleife vor. Eine ForEach-Schleife geht alle Elemente einer Auflistung durch.
    Was ist bei dir die Auflistung, und was sind das für Elemente?
    Du kannst es sogar nachgucken, welchen Datentyp die Elemente haben: Welchen Datentyp hat das Objekt?
    welchen Datentyp hat die Variable txt - kannst du das herausfinden?

    Aber wie gesagt: Eigentlich gibts da keine Auflistung, denn eine Textbox hat nur einen Text.

    Calamann schrieb:

    Also soll ich textbox2.text in suchstring ändern?
    Ja in Zeile #11 weil in Zeile #9 hast du ja schon der Variablen Suchstring die Text-Eigenschaft von Textbox2 zugewiesen - und als nächstes solltest du deine Controls ordentlich benennen. Textbox2 sagt eigentlich nichts aus...

    Calamann schrieb:

    und verstehe auch noch nicht den gesamten Code
    was ist noch unklar?
    Also unklar ist zum Beispiel diese For Each Zeile. Was passiert da genau und wie kann man das anders lösen, da ErfinderDesRades noch nicht so zufrieden damit ist.
    Was sind diese Index Sachen (IndexOf, FindIndex) und warum muss der = 0 sein?
    Bei IndexOf ist wichtig zu wissen, dass bei einem Fund der Index des Aufkommens des ersten Funds des Suchstrings im Text angibt oder -1, wenn nichts gefunden wurde. Diesen Integerwert als Rückgabe merkst du dir in der Variablen FindIndex.... lese dazu bei MSDN die Doku dieser Methode nocheinmal genau durch. Es gibt dazu auch noch einige Überladungen...(den Link dazu habe ich dir oben gegeben)