C# 向多行文本框添加行号

C# 向多行文本框添加行号,c#,winforms,textbox,line-numbers,C#,Winforms,Textbox,Line Numbers,我的表单中有两个文本框,一个用于内容(mainTextBox),位于右侧,另一个用于行号(linesTextBox),位于左侧。两个框的高度相同,都是多行文本框 每次在mainTextBox中更改文本时,我调用方法writeLineNumbers(mainTextBox.Lines.Count()),该方法运行for循环来填充linesTextBox。看起来是这样的: private void mainTextBox_TextChanged(object sender, EventArgs e)

我的表单中有两个文本框,一个用于内容(
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++;
        }
    }
}
private void writeLineNumbers(整数计数)
{
int lineBoxCount=linesTextBox.Lines.Count();
int mainBoxCount=计数;
如果(lineBoxCount!=mainBoxCount&&lineBoxCount>mainBoxCount)
{
同时(lineBoxCount>mainBoxCount)
{
linesTextBox.Text=linesTextBox.Text.Remove(linesTextBox.Text.LastIndexOf(Environment.NewLine));
lineBoxCount--;
}
}
else if(lineBoxCount!=mainBoxCount&&lineBoxCount
似乎您正在有效地构建代码编辑器中常见的UI(前面有行号)

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

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

wpfo WinForms


在WPF的情况下,您可以始终使用文本框创建自定义控件,并为每行创建一个标签,所有这些都在一个容器(如网格或StackPanel)中

你的权利我正在创建我自己的文本编辑器。我一直在使用记事本,但我想要更多的功能,所以我正在创建自己的小版本。不过我会看看你的建议。也许这是一个更合理的解决方案