【问题标题】:Find all text in textbox and change fore color only for specific string. Vb.net查找文本框中的所有文本并仅更改特定字符串的前景色。 VB.net
【发布时间】:2018-04-19 17:28:21
【问题描述】:

我想要做的是在文本框中搜索特定的字符串并用红色更改前景色,到目前为止它可以工作:

    Private Sub RichTextBox1_TextChanged(sender As Object, e As EventArgs) Handles RichTextBox1.TextChanged

    Dim loc As Integer
    'check if it contains the <html> tag and if it does select it and change the colour to red.
    If RichTextBox1.Text.Contains("Card Locked") Then

        loc = RichTextBox1.Find("Card Locked")
        RichTextBox1.Select(loc, 12)
        RichTextBox1.SelectionColor = System.Drawing.Color.Red
        'TextBox1.ForeColor = System.Drawing.Color.Red

    End If
    If RichTextBox1.Text.Contains("Card Unlocked") Then
        loc = TextBox1.Find("Card Unlocked")
        RichTextBox1.Select(loc, 14)
        RichTextBox1.SelectionColor = System.Drawing.Color.Red


    End If 
    End sub

但是如果在richtextbox1中我有两行“卡锁定”在不同的地方,它只会改变第一个serach的颜色,它只会对第一个着色,而另一个将保持默认颜色。每次应用找到需要的字符串时,如何让它在整个文本中搜索并更改前景色?

【问题讨论】:

  • 一方面,TextBox 类没有 FindSelectionColor 成员。大概您正在使用RichTextBox。请准确描述您的问题,以免造成混淆并因此浪费我们和您的时间。
  • 至于问题,Find 方法允许您指定文本中从何处开始搜索。这意味着您可以在循环中调用Find 并在上一个匹配之后开始每次搜索,直到找不到匹配为止。
  • 如果有任何合理数量的文本,我建议的循环选项可能会非常耗时。你应该比搜索每个TextChanged 事件更聪明一点。通过查看插入符号的位置及其周围的字符,不难确定刚刚发生的更改是否可能导致添加新匹配或删除现有匹配。如果您想匹配“XXX”并且插入符号位于两个“Y”字符之间,那么搜索的意义何在?
  • 是的,对不起,我正在使用richtextbox。顺便说一句,我理解你的建议,但我只是不知道如何让它搜索到文本的结尾,我不知道我可以 TextBox1.Find("Card Locked", IndexToStart),但是如何让它正确循环。文本不是很大,只有 1000 个字符
  • 与所有编程问题一样,您需要先了解逻辑,然后才能编写代码。拿起笔和纸,写下手动实现目标所需执行的步骤。只有当你有一个有效的算法时,你才应该尝试编写代码,因为它是代码需要实现的算法。说你在尝试不超过 10 分钟后就不能做某事根本不准确。您需要更加努力地知道自己无法做到这一点。

标签: vb.net textbox


【解决方案1】:

试试这个,我试过了,效果很好:

For Each ctrl As Control In Controls
        If TypeOf ctrl Is RichTextBox AndAlso DirectCast(ctrl, RichTextBox).Text.Contains(INSERT_YOUR_CHECK_STRING) Then
            'do what you want'
        End If
Next

记得使用DirectCast(ctrl, RichTextBox) 来指代选中的复选框!

【讨论】:

    【解决方案2】:

    好吧,我做了这个,如果有人需要的话:

           Dim index As Integer = 0
        While index < TextBox1.Text.LastIndexOf("Card Locked")
            TextBox1.Find("Card Locked", index, TextBox1.TextLength, RichTextBoxFinds.None)
            TextBox1.SelectionColor = System.Drawing.Color.Red
            index = TextBox1.Text.IndexOf("Card Locked", index) + 1
        End While
    

    【讨论】:

      猜你喜欢
      • 2015-11-04
      • 2013-06-03
      • 1970-01-01
      • 2011-04-27
      • 2015-02-20
      • 1970-01-01
      • 2013-04-17
      • 2011-08-10
      • 2013-01-29
      相关资源
      最近更新 更多