我有一个使用RichTextBox(它是Tab Control的一部分)的程序,而在TextChanged事件中我有这些变量声明:
RichTextBox programTextBox = (RichTextBox)tabControl.TabPages[tabControl.SelectedIndex].Controls[0];
int selectStart = programTextBox.SelectionStart;
int programCurrentLine = programTextBox.GetLineFromCharIndex(programTextBox.SelectionStart);
int programCurrentLineIndex = programTextBox.GetFirstCharIndexFromLine(programCurrentLine);
int programCurrentLineLength = programTextBox.Lines[programCurrentLine].Length;
string programCurrentLineText = programTextBox.Lines[programCurrentLine].ToString();
所有这些在特定事件中都很重要,我多次使用它们以达到多种目的。但是,每次重新计算都会减慢我的程序。
例如,我注意到如果我打开一个稍大的文件(使用我的RichTextBox),然后开始按下例如'a'按钮,有一些明显的滞后。除了这些变量的声明之外,删除除了这些变量之外的每一段代码都没有任何帮助,但是删除上面的代码,完全解决了这个问题。
我有两个问题:1)为什么这些声明会减慢TextChanged事件的速度,2)我该怎么办? (有更快的方法来计算这些变量吗?)
答案 0 :(得分:1)
它不是变量声明 - 它是您用来初始化它们的代码。我发现GetFirstCharIndexFromLine
和Lines
费用很高,我不会惊讶地发现所有 - 目前您正在两次调用Lines
财产
你可以通过删除其中一个// No need to call ToString() - Lines is a string[]
string programCurrentLineText = programTextBox.Lines[programCurrentLine];
int programCurrentLineLength = programCurrentLineText.Length;
调用来改善问题,只需首先获取行,然后查看其长度:
{{1}}
令人遗憾的是,没有任何方式可以说"获取有关给定索引位置的所有信息:它的行,行中的第一个char索引,以及行本身&#34 ;在一个电话中:(
答案 1 :(得分:0)
如果在每次按键时重新计算都不重要,那么最好实现一个在按键上设置的布尔变量,然后有一个计时器来重置它。例如,在事件上添加1.2秒的延迟。我不确定您的应用程序的需求,以便时间可能有点多。