向多行文本框添加行号
Adding line numbers to a multi-line text box
我的表单中有 2 个文本框,一个用于内容 (mainTextBox
),位于右侧,另一个用于行号 (linesTextBox
),位于右侧在左边。两个框的高度相同,并且都是多行文本框。
每次 mainTextBox
中的文本更改时,我都会调用方法 writeLineNumbers(mainTextBox.Lines.Count())
,该方法运行一个 for 循环来填充 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++;
}
}
}
看来您正在有效地尝试构建您经常在代码编辑器中看到的 UI(前面有行号)。
我建议不要尝试重新发明轮子,而是为此使用现有控件。我经常使用 ScintillaNET,这是一个围绕着众所周知的 Scintilla 的 .NET 包装器,例如在 Notepad++ 中使用。
好消息是:您可以免费获得语法高亮。
WPF 还是 WinForms?
在 WPF 的情况下,您始终可以使用内部的文本框创建自定义控件,并在容器(如 Grid 或 StackPanel)中为每一行创建一个标签。
我的表单中有 2 个文本框,一个用于内容 (mainTextBox
),位于右侧,另一个用于行号 (linesTextBox
),位于右侧在左边。两个框的高度相同,并且都是多行文本框。
每次 mainTextBox
中的文本更改时,我都会调用方法 writeLineNumbers(mainTextBox.Lines.Count())
,该方法运行一个 for 循环来填充 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++;
}
}
}
看来您正在有效地尝试构建您经常在代码编辑器中看到的 UI(前面有行号)。
我建议不要尝试重新发明轮子,而是为此使用现有控件。我经常使用 ScintillaNET,这是一个围绕着众所周知的 Scintilla 的 .NET 包装器,例如在 Notepad++ 中使用。
好消息是:您可以免费获得语法高亮。
WPF 还是 WinForms?
在 WPF 的情况下,您始终可以使用内部的文本框创建自定义控件,并在容器(如 Grid 或 StackPanel)中为每一行创建一个标签。