C #: отображение текста в richtextbox в обратном порядке / обновления - PullRequest
2 голосов
/ 05 октября 2010

Я пытаюсь создать «отображение журнала» с помощью элемента управления richtextbox в C # .NET.

public void logLine(string line)
{
     rtxtLoginMessage.AppendText(line + "\r\n");
} 

Есть ли способ отобразить текст в обратном порядке / вверх? (где самые новые записи и дата будут отображаться вверху)

Ваша помощь очень ценится.

Ответы [ 2 ]

9 голосов
/ 05 октября 2010

Короткий ответ

Вы хотите установить выбор на 0, а затем установить свойство SelectedText.

public void logLine(string line)
{
    rtxtLoginMessage.Select(0, 0);    
    rtxtLoginMessage.SelectedText = line + Environment.NewLine;
} 

Длинный ответ

Как я с этим справился?

Используя Reflector , найдите элемент управления RichTextBox и найдите метод AppendText (следуйте базовым типам до TextBoxBase).Посмотрите, что он делает (ниже для удобства).

public void AppendText(string text)
{
    if (text.Length > 0)
    {
        int num;
        int num2;
        this.GetSelectionStartAndLength(out num, out num2);
        try
        {
            int endPosition = this.GetEndPosition();
            this.SelectInternal(endPosition, endPosition, endPosition);
            this.SelectedText = text;
        }
        finally
        {
            if ((base.Width == 0) || (base.Height == 0))
            {
                this.Select(num, num2);
            }
        }
    }
}

Вы увидите, что он находит конечную позицию, устанавливает внутренний выбор, а затем устанавливает SelectedText в новое значение.Чтобы вставить текст в самом начале, вы просто хотите найти начальную позицию вместо конечную позицию .

Теперь, чтобы вам не приходилось повторять этот фрагмент кода каждый раз, когда вы хотите добавить префикс текста, вы можете создать метод расширения .

public static void PrependText(this TextBoxBase textBox, string text)
{
    if (text.Length > 0)
    {
        var start = textBox.SelectionStart;
        var length = textBox.SelectionLength;

        try
        {
            textBox.Select(0, 0);
            textBox.SelectedText = text;
        }
        finally
        {
            if (textBox.Width == 0 || textBox.Height == 0)
                textBox.Select(start, length);
        }
    }
}

Примечание. Я использую только блок Try/Finally, чтобы соответствовать реализации AppendText.Я не уверен как , почему мы бы хотели восстановить начальный выбор, если Width или Height равен 0 (если вы знаете почему, пожалуйста, оставьте комментарий, так как я заинтересован в поиске. выход)

1041 * Кроме того, есть некоторые разногласия с помощью «PREPEND» как противоположность для «Append», как прямое английское определение сбивает с толку (сделать поиск Google - есть несколько сообщений на эту тему).Однако, если вы посмотрите словарь компьютерных терминов Barron , он стал общепринятым.

HTH,

Dennis

3 голосов
/ 05 октября 2010
  public void logLine(string line)
  {     
       rtxtLoginMessage.Select(0, 0);        
       rtxtLoginMessage.SelectedText = line + "\r\n";
  } 
...