winforms 根据当前插入符号位置在RichTextBox中选择整个段落

qq24tv8q  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(116)

我有一个RichTextBoxMultiline设置为true。它可以包含多个值,其中一些值太长并被拉伸成多行,但在RTB中被视为一行。
我试图选择整个值,但当文本被拉伸时,它总是只选择我单击的行。
下面是我使用的代码:

private void SelectLine(RichTextBox rtb)
{
    if (rtb.Lines.Length != 0)
    {
        int firstcharindex = rtb.GetFirstCharIndexOfCurrentLine();
        int currentline = rtb.GetLineFromCharIndex(firstcharindex);
        string currentLineText = rtb.Lines[currentline];
        rtb.Select(firstcharindex, currentLineText.Length);
    }
}

我面临的问题是GetFirstCharIndexOfCurrentLine()获取我点击进入的行中第一个字符的索引,而不是实际值的开始索引。但是,在Lines数组中,值表示为一行。
我如何修改这段代码来选择整个值,而不管它是如何在`RichTextBox中的多行上展开的?

bq8i3lrv

bq8i3lrv1#

TextBoxBase的Lines[]属性返回逻辑行(由换行符\n或回车符+换行符\r\n分隔的文本行)。
GetLineFromCharIndex()方法返回物理行(容器内的 Package 文本)。
如果你想选择包含插入符号的整个段落(逻辑行),你必须寻找它的边界,即\n字符。
RichTextBox仅使用\n(当您添加/粘贴/设置包含任何字符的文本时,\r字符将被删除),TextBox使用\r\n
举例来说:
我使用TextBoxBase作为Type参数,因此您可以将此方法用于RichTextBox和TextBox(两者都派生自TextBoxBase)。你可以把它变成一个扩展方法。

void SelectCurrentParagraph(TextBoxBase tbox) {
    var firstParagraphIndex = tbox.Text.LastIndexOf("\n", tbox.SelectionStart) + 1;

    var trim = tbox is RichTextBox ? 0 : 1;
    var lastParagraphIndex = tbox.Text.IndexOf("\n", tbox.SelectionStart) - trim;

    if (lastParagraphIndex < 0) lastParagraphIndex = tbox.TextLength;
    tbox.Select(firstParagraphIndex, lastParagraphIndex - firstParagraphIndex);
}

顺便说一句,如果你正在使用,例如,按钮来调用这个方法,请记住将RichTextBox / TextBox的HideSelection属性设置为false

相关问题