.net RichTextBox-计算不包括换行符的行数

.net RichTextBox-计算不包括换行符的行数,.net,vb.net,.net,Vb.net,我有下面的代码来搜索和替换richtextbox中的文本,但是当wordwrap打开时,似乎linecount被抛出,它要么替换了错误的行,要么出错 因此,这应该是如何工作的(它确实工作,只是在wordwrap=true时不工作)。 假设我有一个Rich文本框,上面写着“Hello World废话” 步骤1。我在文本框1中键入“StackOverflow” 第2步。当textbox1.text发生变化时,我称SandR(“你好,世界”,textbox1.text.trim,“诸如此类” 第3步。

我有下面的代码来搜索和替换richtextbox中的文本,但是当wordwrap打开时,似乎linecount被抛出,它要么替换了错误的行,要么出错

因此,这应该是如何工作的(它确实工作,只是在wordwrap=true时不工作)。


假设我有一个Rich文本框,上面写着“Hello World废话”

步骤1。我在文本框1中键入“StackOverflow”

第2步。当textbox1.text发生变化时,我称SandR(“你好,世界”,textbox1.text.trim,“诸如此类”

第3步。输出应该是“Hello world StackOverflow废话”

现在,使用下面的代码,这是可行的。但是,当richtextbox中的文本足够长,足以触发wordwrap时,它将停止工作。例如:

Stack Overflow, !

This community restores my faith in humanity. Time and time again, people like  continuously reach out to community questions and help people like me who are struggling to figure out code. It is a learning process for us, and you folks are a great example of what it means to be a good human being.

Thank you all so much for helping users like myself save countless hours of reading material on the internet (that may or may not work due to outdated code, etc) and giving us a chance to learn from someone who is responding to us in real time.

Thanks again !
现在,如果该文本有换行符,并且我尝试使用SandR(“再次感谢”,textbox1.text.trim,“LarsTech!”),它将失败。

我是否可以对该代码进行任何修改以避免此问题

Function SandR(ByVal Search As String, ControlText As Object, Replace As String) As String
        Dim text = ""
        Dim startindex = 0
        Dim endindex = 0
        Try
            For i As Integer = 0 To txtRTB.Lines.Length - 1
                text = txtRTB.Lines(i)
                If text.Contains(Search) = True Then
                    startindex = txtRTB.GetFirstCharIndexFromLine(i)
                    endindex = text.Length
                    txtRTB.[Select](startindex, endindex)
                    txtRTB.Text = txtRTB.Text.Replace(txtRTB.SelectedText, Search & ControlText.Text.Trim & Replace)
                End If
            Next
        Catch
            For i As Integer = 0 To txtRTB.Lines.Length - 1
                text = txtRTB.Lines(i)
                If text.Contains(Search) = True Then
                    startindex = txtRTB.GetFirstCharIndexFromLine(i)
                    endindex = text.Length
                    txtRTB.[Select](startindex, endindex)
                    txtRTB.Text = txtRTB.Text.Replace(txtRTB.SelectedText, Search & ControlText.Trim & Replace)
                End If
            Next
        End Try
    End Function


对于LarsTech:
这就是我使用textchanged时的样子:
这是我使用按钮时的外观:

这就是我更改文本框并再次按下按钮时的样子:

我将删除该Try..Catch,因为发生的任何异常都肯定在您的控制范围内,您可以避免它

当您想要替换文本时,似乎没有必要遍历Lines集合,因此请尝试向后遍历文本,因为替换文本可能会干扰索引位置

Dim lastIndex As Integer = txtRTB.Text.Length - 1
While lastIndex > -1
  lastIndex = txtRTB.Text.Substring(0, lastIndex).LastIndexOf(search)
  If lastIndex > -1 Then
    txtRTB.Select(lastIndex, search.Length)
    txtRTB.SelectedText = search & controlText & replace
  End If
End While

另外,您的函数没有返回任何内容,因此将其转换为子例程。

我将删除Try..Catch,因为发生的任何异常都肯定在您的控制范围内,您可以避免它

当您想要替换文本时,似乎没有必要遍历Lines集合,因此请尝试向后遍历文本,因为替换文本可能会干扰索引位置

Dim lastIndex As Integer = txtRTB.Text.Length - 1
While lastIndex > -1
  lastIndex = txtRTB.Text.Substring(0, lastIndex).LastIndexOf(search)
  If lastIndex > -1 Then
    txtRTB.Select(lastIndex, search.Length)
    txtRTB.SelectedText = search & controlText & replace
  End If
End While

另外,你的函数没有返回任何东西,所以把它变成一个子程序。

嘿,谢谢你的代码,它只运行了一个小的异常:它没有替换文本,似乎是在复制它。谢谢你关于子程序的提示。我会读一读它!@lolikols我正按照你的代码尝试去做。如果你你正在尝试完全替换搜索文本,然后从所选文本行中删除搜索文本。嘿,LarsTech,谢谢你的帮助。我真的很感激。我想你以前也帮过我几次:)。因此,我最初输入的代码按照我需要的方式工作(但不是在启用“自动换行”时):我在文本框中输入一些内容,当文本更改时,它调用SandR(“搜索此文本”,textbox1.text.trim,“第一个参数+textbox.text.trim+此参数”)。它查找文本所在的整行,并替换整个内容。你的代码工作得很好!但它并不能取代整个东西。它要么复制它,要么当我删除搜索时,停止工作。@lolikols你能给我一个小的示例文本吗?文本框里有什么?你在找什么?什么是控制文本?替换文本是什么?您应该更改的那一行代码应该是这样的,我猜:
txtRTB.SelectedText=controlText&replace
在我的测试中,我将controlText用作字符串,而不是对象。@lolikols而不是“再次感谢!”,该行在函数之后应该说什么?在TextChanged事件中替换文本可能会产生奇怪的结果。嘿,谢谢你的代码,它只处理了一个小的异常:它似乎在复制文本,而不是替换文本。谢谢你给我关于子程序的提示。我来读一读@lolikols我是按照你的代码来做的。如果您试图完全替换搜索文本,请从SelectedText行中删除搜索文本。嘿,LarsTech,谢谢您的帮助。我真的很感激。我想你以前也帮过我几次:)。因此,我最初输入的代码按照我需要的方式工作(但不是在启用“自动换行”时):我在文本框中输入一些内容,当文本更改时,它调用SandR(“搜索此文本”,textbox1.text.trim,“第一个参数+textbox.text.trim+此参数”)。它查找文本所在的整行,并替换整个内容。你的代码工作得很好!但它并不能取代整个东西。它要么复制它,要么当我删除搜索时,停止工作。@lolikols你能给我一个小的示例文本吗?文本框里有什么?你在找什么?什么是控制文本?替换文本是什么?您应该更改的那一行代码应该是这样的,我猜:
txtRTB.SelectedText=controlText&replace
在我的测试中,我将controlText用作字符串,而不是对象。@lolikols而不是“再次感谢!”,该行在函数之后应该说什么?替换TextChanged事件中的文本可能会产生奇怪的结果。