我的表单中有两个文本框,一个用于内容(mainTextBox
),位于右侧,另一个用于行号(linesTextBox
),它位于左边。两个框都是相同的高度,都是多行文本框。
每次mainTextBox
中的文字更改时,我都会调用运行for循环的方法writeLineNumbers(mainTextBox.Lines.Count())
来填充linesTextBox
。它看起来像这样:
private void mainTextBox_TextChanged(object sender, EventArgs e)
{
int linecount = mainTextBox.Lines.Count();
writeLineNumbers(linecount);
}
private void writeLineNumbers(int linecount)
{
linesTextBox.Text = "";
int i = 1;
foreach (var lines in mainTextBox.Lines)
{
linesTextBox.AppendText(i + "\n");
i++;
}
}
这很有效,但是一旦你过了大约50行,它对系统来说非常沉重和缓慢。我尝试了一些其他的东西,但我似乎无法找到一种方法来做到这一点。
我尝试过这种方式,但它非常小故障并打破很多,但我认为我在正确的轨道上
private void writeLineNumbers(int count)
{
int lineBoxCount = linesTextBox.Lines.Count();
int mainBoxCount = count;
if (lineBoxCount != mainBoxCount && lineBoxCount > mainBoxCount)
{
while (lineBoxCount > mainBoxCount)
{
linesTextBox.Text = linesTextBox.Text.Remove(linesTextBox.Text.LastIndexOf(Environment.NewLine));
lineBoxCount--;
}
}
else if (lineBoxCount != mainBoxCount && lineBoxCount < mainBoxCount)
{
while (lineBoxCount < mainBoxCount)
{
linesTextBox.AppendText(count + "\n");
lineBoxCount++;
}
}
}
答案 0 :(得分:1)
您似乎正在有效地尝试构建您经常在代码编辑器中看到的UI(前面有行号)。
我建议不要尝试重新发明轮子,但要使用现有的控件。我经常使用ScintillaNET,它是围绕着名的Scintilla的.NET包装器,例如在Notepad ++中使用。
好消息是:你可以免费获得语法高亮。
答案 1 :(得分:0)
WPF o WinForms?
对于WPF,您始终可以使用文本框进行自定义控件,并为容器内的每一行(如Grid或StackPanel)创建一个Label。