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

本文关键字:文本 添加 | 更新日期: 2024-10-21 10:27:28

我的表单中有两个文本框,一个用于内容(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,它是一个。NET包装器围绕常见的Scintilla,例如在Notepad++中使用。

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

WPF o WinForms?

在WPF的情况下,您可以始终在内部制作带有Textbox的自定义控件,并为每一行制作一个Label,所有这些都在一个容器(如Grid或StackPanel)中。