1


我正在寻找一种在富文本框中选择两行(A 和 B)之间的文本的方法。我试过这样的事情:

richTextBox1.Select
(
     richTextBox1.GetFirstCharIndexFromLine(parentesi_inizio[current_idx]),
     (
          richTextBox1.GetFirstCharIndexFromLine(parentesi_fine[current_idx]) -
          richTextBox1.GetFirstCharIndexFromLine(parentesi_inizio[current_idx]) + 1
     )
);

在 parentesi_inizio 和 parentesi_fine 里面我有行号,我应该从 A (parentesi_inizio) 到 B (parentesi_fine) 中选择。

经过一些测试,我认为问题是这样的:

richTextBox1.GetFirstCharIndexFromLine(parentesi_fine[current_idx]) -
richTextBox1.GetFirstCharIndexFromLine(parentesi_inizio[current_idx]) + 1

这段代码起初工作得很好,但我注意到过了一会儿'开始显示结果。

我做了进一步的测试,线条是正确的(即,参考正确的位置),而“选择”没有选择整个部分或不正确(选择不需要的部分)

(最后一部分我用谷歌翻译)

编辑:

想象一下这段文字:

你好
世界|| 点这里(第 1 行)
伙计们!


一个|| B点这里(5号线)
线

我需要选择(不获取文本)此文本:

世界
大佬!


一个

在富文本框中。

示例图像:

情况1:

在此处输入图像描述

案例二:

在此处输入图像描述

这就是我想要的,也是我发布的代码所做的,但过了一段时间,代码开始出现错误,正如我上面所说的(在开始时)。

编辑2:

varocarbas 回复后,我将代码更改为此

richTextBox1.Select (
richTextBox1.GetFirstCharIndexFromLine(parentesi_inizio[current_idx]),

richTextBox1.GetFirstCharIndexFromLine(parentesi_inizio[current_idx])
+ count_length(parentesi_inizio[current_idx], parentesi_fine[current_idx]) );

其中 count_length 是

private int count_length(int A, int B)
{
    // A => first line
    // B => last line

    int tot = 0;

    for (int i = A; i <= B; ++i)
    {
        // read the length of every line between A and B
        tot += richTextBox1.Lines[i].Length - 1;
    }

    // return it
    return tot;
}

但现在代码并非在每种情况下都有效..无论如何这里是使用旧代码的错误案例屏幕(问题开头发布的代码)

错误的
(来源:site11.com

它从第一个{但没有到达最后一个}中选择(我在这里做了一些检查,问题是减法而不是行数。)

编辑 3:

我准备好了对不起varocarbas,我想我只是浪费了你的时间..看到我的屏幕后我注意到问题可能是我试图禁用它的自动换行,现在看来工作正常..对不起你的时间。

4

1 回答 1

2

Why not relying on the lines[] array directly?

string line2 = richTextBox1.lines[1];

Bear in mind that it has its own indexing, that is, to get the first character in the third line you can do:

int firstChar3 = richTextBox1.lines[2].Substring(0, 1);

To refer to the whole richTextBox indexing system, you can rely also on GetFirstCharIndexFromLine. That is:

int startIndexLine2 = richTextBox1.GetFirstCharIndexFromLine(1); //Start index line2
int endIndexLine2 = startIndexLine2 + richTextBox1.lines[1].length - 1; //End index line2

-------- AFTER UPDATED QUESTION

Sorry about that, but I cannot see the code in the links you provided. But the code below should deliver the outputs you want:

int curStart = richTextBox1.GetFirstCharIndexFromLine(2); 
richTextBox1.Select(curStart, richTextBox1.Lines[2].Length);
string curText = richTextBox1.SelectedText;  -> "Guys!"

curStart = richTextBox1.GetFirstCharIndexFromLine(3); 
richTextBox1.Select(curStart, richTextBox1.Lines[3].Length);
curText = richTextBox1.SelectedText;  -> "This"

curStart = richTextBox1.GetFirstCharIndexFromLine(4); 
richTextBox1.Select(curStart, richTextBox1.Lines[4].Length);
curText = richTextBox1.SelectedText;  -> "is"
于 2013-07-12T13:18:18.537 回答