【问题标题】:Bind Console Output to RichEdit将控制台输出绑定到 RichEdit
【发布时间】:2010-09-19 05:49:03
【问题描述】:

非常简单的问题。我有一个带有大量 Console.Writeline 代码的 c# .dll,并且希望能够使用此 .dll 在表单应用程序中查看该输出。是否有一种相对简单的方法可以将控制台输出绑定到 RichEdit(或其他合适的控件)?或者,我可以在表单中嵌入一个实际的控制台外壳吗?我发现了一些类似的问题,但在大多数情况下,人们希望能够接收控制台输入,这对我来说不是必需的。

谢谢。

【问题讨论】:

    标签: c# forms console


    【解决方案1】:

    您可以使用 Console.SetOut() 来重定向输出。这是一个演示该方法的示例表单。在表单上放置一个 RichTextBox 和一个按钮。

    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
            button1.Click += button1_Click;
            Console.SetOut(new MyLogger(richTextBox1));
        }
        class MyLogger : System.IO.TextWriter {
            private RichTextBox rtb;
            public MyLogger(RichTextBox rtb) { this.rtb = rtb; }
            public override Encoding Encoding { get { return null; } }
            public override void Write(char value) {
                if (value != '\r') rtb.AppendText(new string(value, 1));
            }
        }
        private void button1_Click(object sender, EventArgs e) {
            Console.WriteLine(DateTime.Now);
        }
    }
    

    我认为它不会很快,但当我尝试时看起来还不错。您可以通过覆盖更多方法进行优化。

    【讨论】:

    • 感谢您的回复,似乎工作得很好。而且我不需要特别有效的方法。
    • 感谢@Hans Passant,我已将您的解决方案添加到这里的初学者问题中:stackoverflow.com/questions/22028888/…
    【解决方案2】:

    IMO,最好重构现有代码,将现有的 Console.WriteLine 替换为代码中的某个中心方法,然后重新指向 this 方法,大概是通过提供另一个 TextWriter

    private static TextWriter output = Console.Out;
    public static TextWriter Output {
       get {return output;}
       set {output = value ?? Console.Out;}
    }
    public static void WriteLine(string value) {
        output.WriteLine(value);
    }
    public static void WriteLine(string format, params string[] args) {
        output.WriteLine(format, args);
    }
    

    或者(更简单、更简单的静态字段),只需将TextWriter 传递到您现有的代码中并写入?

    【讨论】:

      猜你喜欢
      • 2013-11-14
      • 2021-10-21
      • 1970-01-01
      • 2014-09-19
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多