C#:以相反的顺序/向上显示richtextbox中的文本

时间:2010-10-05 01:09:47

标签: c# richtextbox reverse rtf

我正在尝试使用C#.NET中的richtextbox控件创建“日志显示”。

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

有没有办法以反向/向上显示文字? (最新的日志和日期将显示在顶部)

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:9)

简答

您希望将选择设置为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设置为新值。要在开头插入文字,您只需要找到开始位置而不是结束位置

现在,因此,每次要为文本添加前缀时,您都不必重复此段代码,您可以创建Extension Method

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的实现。我不确定为什么如果WidthHeight为0,我们会想要恢复初始选择(如果您知道原因,请在我发表评论时)我有兴趣发现。)

此外,还有一些争论使用“Prepend”作为“Append”的反面,因为直接的英语定义令人困惑(进行Google搜索 - 该主题有几篇帖子)。但是,如果您查看Barron's Dictionary of Computer Terms,它已成为可接受的用途。

HTH,

丹尼斯

答案 1 :(得分:3)

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