Gute Suchfunktion

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Michael K..

    Gute Suchfunktion

    Hallo Leute, ich habe eine RichTextBox. Diese RTB wird mithilfe einer TextBox durchsucht, d.h. wenn jemand einen Buchstaben in die TextBox eingibt, soll in der RTB eben der vorhandene Name gesucht werden. Ich weiß nicht so recht, wie ich das vorgehen soll???

    VB.NET-Quellcode

    1. Dim SearchName As String = TextBox1.Text
    2. If RichTextBox1.Text.Contains(SearchName) Then
    3. 'Hier soll der Code rein, der dann die Namen anzeigt, die der User in die TextBox eingibt
    4. End If


    Mfg
    hier:
    einfach in vb übersetzen

    Quellcode

    1. int len = this.richTextBox1.TextLength;
    2. int index = 0;
    3. int lastIndex = this.richTextBox1.Text.LastIndexOf(this.textBox1.Text);
    4. while ( index < lastIndex )
    5. {
    6. this.richTextBox1.Find(this.textBox1.Text, index, len, RichTextBoxFinds.None);
    7. this.richTextBox1.SelectionBackColor = Color.Yellow;
    8. index = this.richTextBox1.Text.IndexOf(this.textBox1.Text, index) + 1;
    9. }
    /nicht getestet
    @~blaze~:: Und das würde dann wie aussehen?

    VB.NET-Quellcode

    1. Dim len As Integer = Me.RichTextBox1.TextLength
    2. Dim index As Integer = 0
    3. Dim lastIndex As Integer = Me.RichTextBox1.Text.LastIndexOf(Me.TextBox1.Text)
    4. Do While (index < lastIndex)
    5. Me.RichTextBox1.Find(Me.TextBox1.Text, index, len, RichTextBoxFinds.None)
    6. Me.RichTextBox1.SelectionBackColor = Color.Yellow
    7. index = Me.RichTextBox1.Text.IndexOf(Me.TextBox1.Text, index) + 1
    8. Loop

    Klappt nicht.
    Da muss ich leider wieder den unerfahrenen spielen ;(
    Kp, ob's so passt:

    VB.NET-Quellcode

    1. Dim index As Integer = 0
    2. Dim text As String = myNamedSearchTextBox.Text
    3. Dim totalLength As Integer = myNamedRichTextBox.TextLength
    4. Dim selectionStart As Integer = myNamedSearchTextBox.SelectionStart
    5. Dim selectionLength As Integer = myNamedSearchTextBox.SelectionLength
    6. Do
    7. index = myNamedRichTextBox.Find(text, index, RichTextBoxFinds.None)
    8. If index <> -1 Then
    9. myNamedRichTextBox.SelectionBackColor = Color.Yellow
    10. Else
    11. Exit Do
    12. End If
    13. index += text.Length
    14. Loop While index < totalLength
    15. myNamedSearchTextBox.SelectionStart = selectionStart
    16. myNamedSearchTextBox.SelectionLength = selectionLength


    Die Suche nach dfd sollte in dfdfd auf jeden Fall nur das erste dfd markieren. Und noch mal: Schau' dir den Code in Ruhe an und experimentiere damit herum. Damit lernst du wesentlich besser, als wenn du ihn einfach nur kopierst. (Kapieren, nicht kopieren)

    Gruß
    ~blaze~
    Das mache ich eigentlich mit allen Funktionen, die ich gerade kennengelernt habe. Dank für den Code.
    Jetzt noch eine ganz kleine Frage: Wenn der Text der TextBox jetzt leer ist soll der Text der RichTextBox auch wieder "normal" sein. Color.Control geht nicht.

    Naja, oder eher, wenn Backshift in der TextBox gedrückt wird, soll die Buchstabenfärbung ebenfalls aktualisiert werden.
    Speichere die Stellen, an denen der Text gefunden wurde und die Hintergrundfarben, die darin enthalten sind (können ja auch mehrere sein) in eine Liste einer von dir definierten Klasse. Dannach setze die entsprechenden Farben einfach wieder. Das Rückgängig-machen müsstest du aber schon vor einer Änderung des Textes vornehmen oder die Suche halt entsprechend updaten.
    Versuch' dich da mal selber dran, das kriegst du hin.

    Ach ja: du könntest auch einfach die RTF-Eigenschaft davor speichern und danach wieder setzen.

    Gruß
    ~blaze~
    Okay, das hab ich jetzt kapiert. Aber was ist, wenn ich diese Suchbegriffe nicht markieren sondern darstellen möchte? Beispielsweise suche ich nach "Max Mustermann". Diesen Max Mustermann gibt es in der RichTextBox nicht nur einmal sonder 2 mal. Ich möchte beide Namen darstellen.
    Ich habs ein wenig anders gemacht (ohne markierung):

    VB.NET-Quellcode

    1. Dim SuchBegriff As String = TextBox1.Text
    2. If TextOfRichTextBox1.Contains(SuchBegriff) Then
    3. RichTextBox1.Text = TextBox1.Text
    4. Else
    5. RichTextBox1.Text = "Der angegebene Name konnte nicht gefunden werden."
    6. End If
    7. If TextBox1.Text = "" Then
    8. RichTextBox1.Text = TextOfRichTextBox1
    9. End If


    In Zeile 3 bei RichTextBox1.Text = TextBox1.Text kann ja nicht TextBox1.Text stehen. Dann wird bspw Max Mustermann nur einmal in der RTB angezeigt.
    @~blaze~:: Ich glaub ich habs (mal alleine herausgefunden :D)

    @~blaze~:: Hier:

    VB.NET-Quellcode

    1. Dim i As Integer
    2. Dim index As Integer = 0
    3. Dim len As Integer = Me.RichTextBox1.TextLength
    4. Dim lastIndex As Integer = Me.RichTextBox1.Text.LastIndexOf(Me.TextBox1.Text)
    5. While (index < lastIndex)
    6. i = Me.RichTextBox1.Find(Me.TextBox1.Text, index, len, RichTextBoxFinds.None)
    7. MsgBox(i)
    8. Me.RichTextBox1.SelectionBackColor = Color.Yellow
    9. index = Me.RichTextBox1.Text.IndexOf(Me.TextBox1.Text, index) + 1
    10. End While
    11. For fi As Integer = 0 To lastIndex
    12. MsgBox(RichTextBox1.Text.Chars(fi))
    13. Next


    Der gibt mir aber nur die erste Zeile der Suchergebnisse. Die zweite fehlt noch ;(

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Michael K.“ ()

    @~blaze~:: Erstens ich bin total müde (zu spät ins Bett gegangen :D)
    Zweitens ICH HABS:

    VB.NET-Quellcode

    1. Try
    2. Dim index As Integer = 0
    3. Dim text As String = TextBox1.Text
    4. Dim totalLength As Integer = RichTextBox1.TextLength
    5. Dim selectionStart As Integer = TextBox1.SelectionStart
    6. Dim selectionLength As Integer = TextBox1.SelectionLength
    7. Dim TextBox1_TextLength As Integer = TextBox1.TextLength
    8. Do
    9. index = RichTextBox1.Find(text, index, RichTextBoxFinds.None)
    10. MsgBox(index)
    11. If index <> -1 Then
    12. RichTextBox1.Text = RichTextBox1.SelectedText
    13. Else
    14. Exit Do
    15. End If
    16. index += text.Length
    17. Loop While index < totalLength
    18. TextBox1.SelectionStart = selectionStart
    19. TextBox1.SelectionLength = selectionLength
    20. Catch ex As Exception
    21. MsgBox(ex.Message)
    22. End Try


    Leider ist ex.message nicht leer. Folgender Fehler kommt heraus:

    Der Wert {Length von TextBox1.Text und der Index, wo das Suchergebnis in der RichTextBox1.Text liegt} ist für start ungültig. start sollte zwischen 0 und {Length von TextBox1.Text} kann.

    Hinweis: Die in {} angezeigten Wörter sind die Werte, die bei der Suche herauskommen und u.a. auch der TextLength der TextBox1 ist.
    Try-Catch sollte man grundsätzlich bei ungetestetem Code vermeiden und wenn dann nur bei wirklich benötigten Funktionen. Hab' den Link jetzt nicht da, aber ErfinderDesRades hat da ein Tutorial dazu geschrieben.
    Mein Code ist darauf ausgelegt, dass die vorher ausgewählten Textpassagen wieder ausgewählt werden. Irgendwas passt da nicht, aber ich hab keine Ahnung, was du mit den einzelnen Zeilen bezweckst (:P). Kommentier die dir doch bitte, dann siehst du vielleicht sogar selber, woran's scheitert.

    Gruß
    ~blaze~
    Hmm, ich mag TryCatch.
    Auf jeden Fall, ich hab diese "Gute Suchfunktion" endlich gefunden oder eher gesagt selber erstellt. Sie markiert den Text, der in der TextBox eingegeben wird. Wird Backshift gedrückt, so entfärbt sich der vorher gesuchte Text wieder. Interessant, oder?
    Was man jetzt noch an der SuFu verbessern könnte wäre, dass der gesuchte Text nicht markiert wird, sondern in der RichTextBox angezeigt wird, d.h. der andere Text in der RTB wird nicht angezeigt, sondern nur das Suchergebnis. Aber ich glaub mal nicht, dass ich das hinkriege :D