【问题标题】:Select text from line A to line B in richtextbox在richtextbox中从A行到B行选择文本
【发布时间】:2013-07-12 12:08:06
【问题描述】:


我正在寻找一种在富文本框中选择两行(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

此代码起初运行良好,但我注意到一段时间后'开始显示结果。

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

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

编辑:

想象一下这段文字:

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


一个 || B 点在这里(第 5 行)

我需要选择(不是获取文本)这个文本:

世界
伙计们!



在富文本框中。

示例图片:

案例一:

案例 2:

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

编辑 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,我想我只是浪费了你的时间.. 看到我的屏幕后,我注意到问题可能是自动换行,我试图禁用它,现在似乎可以正常工作了.. 对不起你的时间。

【问题讨论】:

    标签: c# richtextbox


    【解决方案1】:

    为什么不直接依赖lines[] 数组呢?

    string line2 = richTextBox1.lines[1];
    

    请记住,它有自己的索引,也就是说,要获取第三行的第一个字符,您可以这样做:

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

    要引用整个richTextBox 索引系统,您还可以依赖GetFirstCharIndexFromLine。那就是:

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

    -------- 更新后的问题

    很抱歉,我在您提供的链接中看不到代码。但是下面的代码应该提供你想要的输出:

    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"
    

    【讨论】:

    • 我已经知道如何获取文本,但我需要选择文本(真正选择不仅仅是获取文本).. 我不知道 Lines[] 对我有什么用..
    • 这就是你的意思?获取与全局richTextBox 索引系统相关的每一行的索引?
    • 请参阅我的问题中的编辑 2;我不会在这里发布我更改的内容,因为我认为太大了.. 无论如何感谢您的帮助。 编辑: 我想我已经解决了问题
    • 你没有包含我的代码。 parentesi_inizio[current_idx] 是什么意思?你应该直接把richTextBox1.GetFirstCharIndexFromLine(line_number_starting_from_zero)。您能否将代码贴在 parentesi_inizio[] 所在的位置?
    • 看,这个想法很简单:使用 GetFirstCharIndexFromLine(line_number) 您可以获得行相对于richtextbox的起始索引(Select() 确实考虑了);然后你必须输入选择的长度,即行的总长度。了解这些想法并相应地调整您的代码。
    猜你喜欢
    • 2013-11-07
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多