C#: отображение текста в richtextbox в обратном порядке / вверх



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



public void logLine(string line)
{
rtxtLoginMessage.AppendText(line + "rn");
}


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



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

694   2  

2 ответов:

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

Вы хотите установить выделение в 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 (если вы знаете, почему, пожалуйста, оставьте комментарий, поскольку мне интересно это выяснить).

Кроме того, есть некоторые возражения против использования "Prepend" в качестве противоположного для "Append", поскольку прямое английское определение сбивает с толку (сделайте поиск в Google - есть несколько сообщений на эту тему). Однако, если вы посмотрите на словарь компьютерных терминов Баррона , он стал общепринятым.

HTH,

Деннис

  public void logLine(string line)
  {     
       rtxtLoginMessage.Select(0, 0);        
       rtxtLoginMessage.SelectedText = line + "\r\n";
  } 

Comments

    Ничего не найдено.