Как показать номер строки в RichTextBox C # - PullRequest
8 голосов
/ 02 апреля 2010

Я делаю простой текстовый редактор и скрипт с подсветкой кода. Для этого я использую RichTextBox. Но я не знаю, как заставить его отображать номера строк с левой стороны, как в VS или Notepad ++. Есть ли какое-нибудь решение?

Ответы [ 6 ]

18 голосов
/ 19 апреля 2010

Я пытался повторно использовать код из статей codeproject, на которые ссылаются в других местах, но каждый вариант, на который я смотрел, выглядел слишком глупым.

Итак, я построил еще один RichTextBoxEx, который отображает номера строк.

Нумерация строк может быть включена или выключена. Это быстро. Прокручивается чисто. Вы можете выбрать цвет чисел, цвета фона для градиента, толщину границы, шрифт, использовать ли начальные нули. Вы можете выбрать нумерацию строк «как показано» или в соответствии с жесткими символами новой строки в RTB.

Примеры:

enter image description here

enter image description here

enter image description here

У него есть ограничения: цифры отображаются только слева. Вы можете изменить это без особых усилий, если вам не все равно.

Код разработан как проект C #. Хотя это часть более крупного «решения» (инструмент визуализации XPath), пользовательский RichTextBox упакован как отдельная сборка и готов к использованию в ваших новых проектах. В Visual Studio просто добавьте ссылку на библиотеку DLL, и вы можете перетащить ее на свою область дизайна. Вы можете просто отказаться от другого кода из более крупного решения.

См. Код

0 голосов
/ 20 февраля 2016
    public int getWidth()
    {
        int w = 25;
        // get total lines of richTextBox1
        int line = richTextBox1.Lines.Length;

        if (line <= 99)
        {
            w = 20 + (int)richTextBox1.Font.Size;
        }
        else if (line <= 999)
        {
            w = 30 + (int)richTextBox1.Font.Size;
        }
        else
        {
            w = 50 + (int)richTextBox1.Font.Size;
        }

        return w;
    }

    public void AddLineNumbers()
    {
        // create & set Point pt to (0,0)
        Point pt = new Point(0, 0);
        // get First Index & First Line from richTextBox1
        int First_Index = richTextBox1.GetCharIndexFromPosition(pt);
        int First_Line = richTextBox1.GetLineFromCharIndex(First_Index);
        // set X & Y coordinates of Point pt to ClientRectangle Width & Height respectively
        pt.X = ClientRectangle.Width;
        pt.Y = ClientRectangle.Height;
        // get Last Index & Last Line from richTextBox1
        int Last_Index = richTextBox1.GetCharIndexFromPosition(pt);
        int Last_Line = richTextBox1.GetLineFromCharIndex(Last_Index);
        // set Center alignment to LineNumberTextBox
        LineNumberTextBox.SelectionAlignment = HorizontalAlignment.Center;
        // set LineNumberTextBox text to null & width to getWidth() function value
        LineNumberTextBox.Text = "";
        LineNumberTextBox.Width = getWidth();
        // now add each line number to LineNumberTextBox upto last line
        for (int i = First_Line; i <= Last_Line + 2; i++)
        {
            LineNumberTextBox.Text += i + 1 + "\n";
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        LineNumberTextBox.Font = richTextBox1.Font;
        richTextBox1.Select();
        AddLineNumbers();
    }

    private void richTextBox1_SelectionChanged(object sender, EventArgs e)
    {
        Point pt = richTextBox1.GetPositionFromCharIndex(richTextBox1.SelectionStart);
        if (pt.X == 1)
        {
            AddLineNumbers();
        }
    }

    private void richTextBox1_VScroll(object sender, EventArgs e)
    {
        LineNumberTextBox.Text = "";
        AddLineNumbers();
        LineNumberTextBox.Invalidate();
    }

    private void richTextBox1_TextChanged(object sender, EventArgs e)
    {
        if (richTextBox1.Text == "")
        {
            AddLineNumbers();
        }
    }

    private void richTextBox1_FontChanged(object sender, EventArgs e)
    {
        LineNumberTextBox.Font = richTextBox1.Font;
        richTextBox1.Select();
        AddLineNumbers();
    }

    private void LineNumberTextBox_MouseDown(object sender, MouseEventArgs e)
    {
        richTextBox1.Select();
        LineNumberTextBox.DeselectAll();
    }

    private void Form1_Resize(object sender, EventArgs e)
    {
        AddLineNumbers();
    }
0 голосов
/ 24 ноября 2010

Простой способ:

Dim myArray = RichTextBox1.Text.Split()

Dim cnt As Integer = 0
RichTextBox1.Clear()

Do While cnt < myArray.Count
  RichTextBox1.AppendText(cnt & ":" & myArray(cnt) & vbNewLine)
  cnt = cnt + 1
Loop
0 голосов
/ 12 октября 2010

Scintilla.Net http://scintillanet.codeplex.com/ может быть наиболее подходящим решением для ваших нужд. Но для своего проекта я использовал решение, предложенное Cheeso (RichTextBoxEx из визуализатора XPath). Это просто и достаточно быстро для не очень больших документов. Все остальные компоненты .net из Интернета были невероятно медленными.

0 голосов
/ 02 апреля 2010

Я бы сохранил каждую строку в классе, который имеет методы для публикации в richtextbox. В этом методе вы можете добавить номер строки в зависимости от ее положения в классе.

Например (очень грубо):

class myText
{
    public List<string> Lines;

    public string GetList()
    {
        StringBuilder sb = new StringBuilder();
        int i = 0;
        foreach (string s in Lines)
        {
            sb.AppendFormat("{0}: {1}", i, s).AppendLine();
            i++;
        }
        return sb.ToString();
    }
}
0 голосов
/ 02 апреля 2010

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

...