将行号添加到多行文本框中

时间:2015-03-05 13:12:28

标签: c# winforms textbox line-numbers

我的表单中有两个文本框,一个用于内容(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++;
        }
    }
}

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

WPF o WinForms?

对于WPF,您始终可以使用文本框进行自定义控件,并为容器内的每一行(如Grid或StackPanel)创建一个Label。