向多行文本框添加行号

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)中为每一行创建一个标签。