Получение точного массива строк из элемента управления RichTextBox - PullRequest
1 голос
/ 18 октября 2010

В моей форме есть элемент управления RichTextBox.Элемент управления настроен таким образом, что он будет перенесен на следующую строку после ввода 32 строк текста.Проблема в том, что я хочу получить массив строк, представляющих строки в моем элементе управления.Я знаю, что к RichTextBox прикреплено свойство Lines, но у меня возникают 2 проблемы:

1) Я ТОЛЬКО хочу, чтобы массив строк отображал только те строки, которые видны только на экране.Прямо сейчас массив Lines возвращает каждую строку в RichTextBox.Я хочу, чтобы только строки, видимые на экране, были возвращены.

2) Свойство Lines не дает мне истинное представление о моих линиях.Он считает "строку" как строку текста, заканчивающуюся символом возврата каретки или \ n.Другими словами, если я наберу 64 символа, и ни один из них не будет символом возврата каретки, он должен вернуть 2 строки (потому что в каждой строке 32 символа).Вместо этого он не возвращает никаких строк, пока я не нажму Enter.Даже тогда он возвращает только 1 строку, а не 2. Он действует больше как свойство Paragraph, если такое было.

Кто-нибудь знает способ обойти эти 2 проблемы? Я использую C # btw

1 Ответ

1 голос
/ 18 октября 2010

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

public partial class Form1 : Form
{        
    public Form1()
    {
        InitializeComponent();                        
    }        

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

        // Lines corresponding to the first and last characters:
        int firstLine = richTextBox1.GetLineFromCharIndex(0); 
        int lastLine = richTextBox1.GetLineFromCharIndex(richTextBox1.Text.Length);

        // Get array of lines:
        List<string> lines = new List<string>();
        for (int i = firstLine; i <= lastLine; i++)
        {
            int firstIndexFromLine = richTextBox1.GetFirstCharIndexFromLine(i);
            int firstIndexFromNextLine = richTextBox1.GetFirstCharIndexFromLine(i + 1);

            if (firstIndexFromNextLine == -1)
            {
                // Get character index of last character in this line:
                Point pt = new Point(richTextBox1.ClientRectangle.Width, richTextBox1.GetPositionFromCharIndex(firstIndexFromLine).Y);
                firstIndexFromNextLine = richTextBox1.GetCharIndexFromPosition(pt);
                firstIndexFromNextLine += 1;
            }

            lines.Add(richTextBox1.Text.Substring(firstIndexFromLine, firstIndexFromNextLine - firstIndexFromLine));
        }

        // Print to richTextBox2 while debugging:
        richTextBox2.Text = "";
        foreach (string line in lines)
        {
            richTextBox2.AppendText(">> " + line + Environment.NewLine);
        }                        
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...