选择文本并在RichTextBox的一行上更改它的颜色

时间:2015-06-30 23:10:26

标签: c# visual-studio-2010 foreach richtextbox appendtext

下午好。我是新手堆叠溢出作为海报,但多年来引用它。我一直在研究我的这个问题大约两个星期,虽然我已经看到了很接近的解决方案,但我仍然有问题。

我正在编写一个C#gui,它读入汇编代码文件并突出显示不同的文本项,以便通过另一个程序进一步处理。我的表单有一个显示文本的RichTextBox。在下面的例子中,我试图选择';'位置的文本,直到行的结尾,并将文本更改为红色。这是我正在使用的代码。

请注意:程序读入的文件长度不一致,并非所有行的格式都相同,因此我不能简单地搜索&#39 ;;'并对此进行操作。

在另一篇文章中,一个成员为AppendText提供了一个扩展方法,除了原始文本和我重新格式化的文本一起存在之外,我已经完美地工作了。这是该网站的链接: How to use multi color in richtextbox

// Loop that it all runs in
Foreach (var line in inArray)
{   

  // getting the index of the ‘;’ assembly comments
  int cmntIndex = line.LastIndexOf(';');

  // getting the index of where I am in the rtb at this time.  
  int rtbIndex = rtb.GetFirstCharIndexOfCurrentLine();

  // just making sure I have a valid index
  if (cmntIndex != -1)
  {
    // using rtb.select to only select the desired 
    // text but for some reason I get it all    
    rtb.Select(cmntIndex + rtbIndex, rtb.SelectionLength);
    rtb.SelectionColor = Color.Red;
  }
}

以下是原始形式的文件中的示例汇编代码,所有文本都是黑色的:

;;TAG SOMETHING, SOMEONE START                          
    ASSEMBLY CODE       ; Assembly comments
    ASSEMBLY CODE       ; Assembly comments
    ASSEMBLY CODE       ; Assembly comments
;;TAG SOMETHING, SOMEONE FINISH

当调用rtb.GetFirstCharIndexOfCurrentLine()时,它返回RTB的有效索引,我想如果我添加line.LastIndexOf(';')返回的值,那么我将只能选择上面的文本{ {1}}并将其变为红色。

发生的是整条线变红。

当我使用上面的AppendText方法时,我得到了

; Assembly comments

黑色代码与重新着色的文本完全相同。在这种情况下,我需要知道如何清除RTB中的行和/或覆盖那里的文本。我尝试过的所有选项都会删除这些行。

任何人,我确信这很长,但我真的很难过,非常感谢你的建议。

1 个答案:

答案 0 :(得分:2)

我希望我能正确理解你。

这循环遍历richtextbox中的每一行,找出哪些行是汇编注释,然后在“;”之后使所有内容变为红色

根据要求使用FOREACH循环

要使用foreach循环,您只需手动跟踪索引,如下所示:

// Index
int index = 0;

// Loop over each line
foreach (string line in richTextBox1.Lines)
{
    // Ignore the non-assembly lines
    if (line.Substring(0, 2) != ";;")
    {
        // Start position
        int start = (richTextBox1.GetFirstCharIndexFromLine(index) + line.LastIndexOf(";") + 1);

        // Length
        int length = line.Substring(line.LastIndexOf(";"), (line.Length - (line.LastIndexOf(";")))).Length;

        // Make the selection
        richTextBox1.SelectionStart = start;
        richTextBox1.SelectionLength = length;

        // Change the colour
        richTextBox1.SelectionColor = Color.Red;
    }

    // Increase index
    index++;
}

使用FOR循环

// Loop over each line
for(int i = 0; i < richTextBox1.Lines.Count(); i++)
{
    // Current line text
    string currentLine = richTextBox1.Lines[i];

    // Ignore the non-assembly lines
    if (currentLine.Substring(0, 2) != ";;")
    {
        // Start position
        int start = (richTextBox1.GetFirstCharIndexFromLine(i) + currentLine.LastIndexOf(";") + 1);

        // Length
        int length = currentLine.Substring(currentLine.LastIndexOf(";"), (currentLine.Length - (currentLine.LastIndexOf(";")))).Length;

        // Make the selection
        richTextBox1.SelectionStart = start;
        richTextBox1.SelectionLength = length;

        // Change the colour
        richTextBox1.SelectionColor = Color.Red;
    }
}

Example of red highlighted richtext

修改

重新阅读你的问题我很困惑你是否想要成功;红色也是。

如果您确实从此行中删除了+1:

int start = (richTextBox1.GetFirstCharIndexFromLine(i) + currentLine.LastIndexOf(";") + 1);