Text durchsuchen

    • VB.NET

    Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

      Text durchsuchen

      Hi
      Hier mal ein einfacher Code zum durchsuchen von RichTextBoxen:

      VB.NET-Quellcode

      1. Imports System.Text.RegularExpressions
      2. Public Class Form1
      3. Private rtbmRichTextBoxMatches As New List(Of RichTextBoxMatch)
      4. Private Sub ButtonFinden_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonFinden.Click
      5. Finden()
      6. End Sub
      7. Private Sub Finden()
      8. If TextBoxSearchPattern.Text = "" Then
      9. MsgBox("Bitte geben Sie an, wonach Sie suchen wollen.", 48)
      10. Exit Sub
      11. End If
      12. 'Vorhergehende Suche löschen
      13. If rtbmRichTextBoxMatches.Count > 0 Then
      14. Zuruecksetzen()
      15. End If
      16. 'Position und Länge der momentanen Markierung speichern
      17. Dim pos As Integer = RichTextBoxTextField.SelectionStart
      18. Dim Len As Integer = RichTextBoxTextField.SelectionLength
      19. 'Regex erstellen und matches herausfinden
      20. For Each m As Match In Regex.Matches(RichTextBoxTextField.Text, Regex.Escape(TextBoxSearchPattern.Text), IIf(CheckBoxIgnoreCase.Checked, 1, 0))
      21. 'Gefundene Objekte Hellgrau markieren
      22. RichTextBoxTextField.SelectionStart = m.Index
      23. RichTextBoxTextField.SelectionLength = m.Length
      24. 'Speichern der Daten in einer Liste
      25. rtbmRichTextBoxMatches.Add(New RichTextBoxMatch() With {.Rtf = RichTextBoxTextField.SelectedRtf, .Index = m.Index, .Length = m.Length})
      26. RichTextBoxTextField.SelectionBackColor = Color.Gainsboro
      27. Next
      28. 'Markierungsposition und Länge wieder übernehmen
      29. RichTextBoxTextField.SelectionStart = pos
      30. RichTextBoxTextField.SelectionLength = Len
      31. End Sub
      32. Public Sub Zuruecksetzen()
      33. If rtbmRichTextBoxMatches.Count = 0 Then
      34. 'Ungültige Anzahl der Matches abfangen
      35. MsgBox("Diese Funktion steht nur zur verfügung, wenn Suchergebnisse vorhanden sind.", 48)
      36. Else
      37. 'wieder Position und Länge der momentanen Markierung speichern
      38. Dim pos As Integer = RichTextBoxTextField.SelectionStart
      39. Dim Len As Integer = RichTextBoxTextField.SelectionLength
      40. 'Alle matches auswerten und zurücksetzen
      41. For Each m As RichTextBoxMatch In rtbmRichTextBoxMatches
      42. 'Gefundene Objekte markieren
      43. RichTextBoxTextField.SelectionStart = m.Index
      44. RichTextBoxTextField.SelectionLength = m.Length
      45. 'Rtf wiederherstellen
      46. RichTextBoxTextField.SelectedRtf = m.Rtf
      47. Next
      48. rtbmRichTextBoxMatches.Clear()
      49. 'Markierungsposition und Länge wieder übernehmen
      50. RichTextBoxTextField.SelectionStart = pos
      51. RichTextBoxTextField.SelectionLength = Len
      52. End If
      53. End Sub
      54. Private Sub ButtonZuruecksetzen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonZuruecksetzen.Click
      55. Zuruecksetzen()
      56. End Sub
      57. Private Sub RichTextBoxTextField_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles RichTextBoxTextField.KeyDown
      58. If rtbmRichTextBoxMatches.Count > 0 Then
      59. Zuruecksetzen() 'Beim Drücken einer Taste Text zurücksetzen
      60. End If
      61. End Sub
      62. End Class
      63. Public Class RichTextBoxMatch
      64. Private strRtf As String
      65. Private iIndex As Integer
      66. Private iLength As Integer
      67. ''' <summary>
      68. ''' Textformattierung des Matches.
      69. ''' </summary>
      70. ''' <value></value>
      71. ''' <returns></returns>
      72. ''' <remarks></remarks>
      73. Public Property Rtf() As String
      74. Get
      75. Return strRtf
      76. End Get
      77. Set(ByVal value As String)
      78. strRtf = value
      79. End Set
      80. End Property
      81. ''' <summary>
      82. ''' Position des Textes.
      83. ''' </summary>
      84. ''' <value></value>
      85. ''' <returns></returns>
      86. ''' <remarks></remarks>
      87. Public Property Index() As Integer
      88. Get
      89. Return iIndex
      90. End Get
      91. Set(ByVal value As Integer)
      92. iIndex = value
      93. End Set
      94. End Property
      95. ''' <summary>
      96. ''' Länge des Textes.
      97. ''' </summary>
      98. ''' <value></value>
      99. ''' <returns></returns>
      100. ''' <remarks></remarks>
      101. Public Property Length() As Integer
      102. Get
      103. Return iLength
      104. End Get
      105. Set(ByVal value As Integer)
      106. iLength = value
      107. End Set
      108. End Property
      109. End Class


      Dazu werden 3 Controls benötigt:
      1x RichTextBox(RichTextBoxTextField)
      1x TextBox(TextBoxSearchPattern)
      1x CheckBox(CheckBoxIgnoreCase)

      Die gefundenen Werte werden grau hinterlegt.

      Importierte Namespaces:
      System.Text.RegularExpressions (oben Imports System.Text.RegularExpressions schreiben)

      Gruß
      ~blaze~

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

      Hi
      Das ist mit dem Code nicht möglich, da der Webbrowser kein SelectionStart usw. unterstützt. Allerdings könntest du den Code soweit umschreiben, dass er auch funktioniert. Ich arbeite nicht mit dem Webbrowser und kann somit keine Tipps geben. Allerdings würde ich das auch über Regular expressions machen. Wenn du bei Google suchst, findest du bestimmt einiges.

      Gruß
      ~blaze~
      Mal ne Frage: Warum so kompliziert? Mit dem Code geht es genauso gut, nur dass man halt die Farben nich nicht drinne hat. Auch Mehrzeilige Suchen funktionieren damit:

      1xButton: Suchen
      2xTextbox: Editor, Suchfeld

      VB.NET-Quellcode

      1. Dim Letzter As Integer = 0
      2. Private Sub Suchen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Suchen.Click
      3. Dim Start As Integer = Editor.Text.IndexOf(Suchfeld.Text, Letzter)
      4. If Start > -1 Then
      5. Editor.Select(Start, Suchfeld.TextLength)
      6. Letzter = Start + 1
      7. Else
      8. Letzter = 0
      9. End If
      10. End Sub


      ^^

      ~ Chris
      To make foobar2000 a real random music player, I figured out the only way to achieve this is to use Windows Media Player.

      At some point in time, you recognize that knowing more does not necessarily make you more happy.