【问题标题】:Adding line numbers to a multi-line text box向多行文本框添加行号
【发布时间】:2015-03-05 13:12:27
【问题描述】:

我的表单中有 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++;
        }
    }
}

【问题讨论】:

    标签: c# winforms textbox line-numbers


    【解决方案1】:

    您似乎正在有效地尝试构建您经常在代码编辑器中看到的 UI(前面有行号)。

    我建议不要尝试重新发明轮子,而是为此使用现有控件。我经常使用ScintillaNET,它是一个围绕常见的 Scintilla 的 .NET 包装器,例如在 Notepad++ 中使用。

    好消息是:您可以免费获得语法高亮显示。

    【讨论】:

    • 你的权利,我正在创建自己的文本编辑器。我一直使用记事本,但我想要更多功能,所以我正在创建自己的小版本。但是,我会检查您的建议。也许它是一个更合理的解决方案
    【解决方案2】:

    WPF 或 WinForms?

    在 WPF 的情况下,您始终可以使用内部的文本框制作自定义控件,并在 Grid 或 StackPanel 等容器内为每一行制作标签。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-29
      • 2018-07-29
      相关资源
      最近更新 更多