.net 一个很好的食谱'行号'一样的功能

hjzp0vay  于 2022-12-27  发布在  .NET
关注(0)|答案(2)|浏览(118)

我必须给我的应用程序(C++/CLI - .net2.0)添加行号,这是一个用于专门编程语言的代码编辑器。
问题出在我的解决方案的性能上。我是这样做的,对于my _rtbCode控件的每个textChanged事件,这个函数都会被触发:

void DocumentElement::SetupLineNumbersCount() {
    StringBuilder ^builder = gcnew StringBuilder();
    if(_tbLineNumbers->Lines->Length > _rtbCode->Lines->Length) {
        for(int i = 0; i <= _rtbCode->Lines->Length;) {
            if(i != 0) builder->Append("\r\n");
            builder->Append(++ i);
            builder->Append(".");
        }
        _tbLineNumbers->Text = builder->ToString();
    }
    else if(_tbLineNumbers->Lines->Length < _rtbCode->Lines->Length) {
        builder->Append(_tbLineNumbers->Text);
        for(int i = _tbLineNumbers->Lines->Length; i < _rtbCode->Lines->Length;) {
            builder->Append("\r\n");
            builder->Append(++ i);
            builder->Append(".");
        }
        _tbLineNumbers->Text = builder->ToString();
    }
}

Where _tbLineNumbers是一个文本框,在其中放置行号。这是太慢了(我已经与其他一些代码编辑器进行了比较)。我试图粘贴几行(大约10000行),我有巨大的React延迟。
(我已经检查了How to print line numbers for textbox in c#

wj8zmpe1

wj8zmpe11#

在代码TextBox的Scroll/Resize事件中更新行号TextBox是否更好?
这样,您只需要关心可见的一组行,在代码窗口中键入代码时不需要刷新行号。
GetFirstVisibleLineIndex
GetLastVisibleLineIndex
这些可能也会帮到你!

vwkv1x7d

vwkv1x7d2#

问题是,正如你所猜测的,你在每个文本改变事件上运行这段代码,当更多的文本被添加或删除时,它会发生,当文本颜色改变时也会发生!
我建议你采取一种更平淡的观点。
你只需要检查System.Environment.Newline字符,即使这样,也只需要在通过编程添加文本时,例如复制、粘贴、打开文件等。否则,你可以检查Keypress事件,以确定是否按下了回车键或回车键(因为这些键将换行符插入文本)。
如果代码文件本身并不需要行号,而只是在编辑视图中使用,那么我建议你在编辑器窗口旁边创建一个新的只读文本窗口。使用“换行符事件”将它们在滚动位置绑定在一起,并在添加换行符时自动填充行号。然后你可以轻松地保存编辑过的代码,而不必删除行号。
或者,使行号占据每行的前4个字符(作为示例),代码从位置7开始。同样,只有在发生换行符事件时才计算行号,自动添加行号和后面的3个空格。

相关问题