Добавление номеров строк в многострочное текстовое поле

У меня есть 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++;
        }
    }
}

person Leathel    schedule 05.03.2015    source источник


Ответы (2)


Кажется, вы эффективно пытаетесь создать пользовательский интерфейс, который вы часто видите в редакторах кода (с номерами строк впереди).

Я бы рекомендовал не пытаться изобретать велосипед, а использовать для этого существующий элемент управления. Я часто использую ScintillaNET, который представляет собой оболочку .NET для широко известного Scintilla, который используется, например, в Notepad++. .

Хорошая новость: вы получаете подсветку синтаксиса бесплатно.

person Patrick Hofman    schedule 05.03.2015
comment
Ваше право, я создаю свой собственный текстовый редактор. Я постоянно пользуюсь блокнотом, но мне хотелось добавить еще пару функций, поэтому я создаю свою маленькую версию. Я проверю, что вы предложили однако. Возможно, это более разумное решение - person Leathel; 05.03.2015

WPF или WinForms?

В случае WPF вы всегда можете создать свой собственный элемент управления с текстовым полем внутри и создать метку для каждой строки внутри контейнера, такого как Grid или StackPanel.

person Dani Ribas    schedule 05.03.2015