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