C#:RichText中的自动文本突出显示

时间:2016-08-02 21:04:25

标签: c#

我对C#非常非常新,几乎在10年前在学校写了一些计算器,文本编辑器和数据库客户端:)不是我正在尝试为自己和我的同事创建一个工具来查看跟踪和登录更容易办法。所有我们都知道Notepad ++,我们每天都使用文本突出显示,样式,但事实是,在关闭Notepad ++后,这些亮点会丢失。 所以我现在的目标是创建相同的文本编辑器,但是它可以保存你的工作。目前我正在处理这个功能,所以当我选择一些文本时,它将在整个文档中搜索相同的内容并突出显示它,例如红色背景。我添加了这个:

 private void richTextBox1_SelectionChanged(object sender, EventArgs e)
        {
            int startIndex = 0;

            while (startIndex<richTextBox1.TextLength)
            {
                int wordStartIndex = richTextBox1.Find(richTextBox1.SelectedText, startIndex, RichTextBoxFinds.None);
                if (wordStartIndex != -1)
                {
                    richTextBox1.SelectionStart = wordStartIndex;
                    richTextBox1.SelectionLength = richTextBox1.SelectionLength;
                    richTextBox1.SelectionBackColor = Color.Red;
                }
                else
                    break;
                startIndex += wordStartIndex + richTextBox1.SelectionLength;
            }


        }

但它给了我&#34; StackOverFlow&#34;因为我在这里有一个循环。你可以帮助我吗? 我想我需要运行2次搜索以避免循环 - 一次在选择索引之前,一次之后。或者可能有更简单的选择?

谢谢大家,伙计们!

2 个答案:

答案 0 :(得分:0)

你正在获得一个无限循环,因为你正处于检查选择更改的事件中,然后在那个事件中,你正在改变选择,这会导致一个事件,你在那里改变选择,这会导致一个事件...

如果你想避免这种情况,你需要一个类级变量,如

bool inSelectionChangeEvent;

然后将您的代码更改为:

 private void richTextBox1_SelectionChanged(object sender, EventArgs e)
 {
   if (!inSelectionChangeEvent){
    inSelectionChangeEvent = true;
   }
   else{
    return;
   }
...

另外,您正在编写自己的OWN文本编辑器?呃,可能是一个更简单的解决方案:)

答案 1 :(得分:0)

您的问题在于选择长度。就在这里:

richTextBox1.SelectionLength = richTextBox1.SelectionLength;

设置与自己相同的东西并不好,我猜这是一个意外。当SelectionLength为0时,startIndex永远不会增加(任何东西+ 0都是任何东西)。

我要做的第一件事就是检查是否richTextBox1.SelectionLength < 1,如果是,只需从方法返回而不做任何事情。

来自MSDN的此代码段应该可以帮助您完成正在执行的操作:

string wordToFind = "melp";
int index = richTextBox1.Text.IndexOf( wordToFind );
while( index != -1 )
{
    richTextBox1.Select( index, wordToFind.Length );
    richTextBox1.SelectionColor = Color.Red;

    index = richTextBox1.Text.IndexOf( wordToFind, index + wordToFind.Length );
}