代码之家  ›  专栏  ›  技术社区  ›  Fusspawn

将控制台输出重定向到winforms列表框

  •  5
  • Fusspawn  · 技术社区  · 15 年前

    我已经构建了一个库,它使用console.writeline()转储大部分调试文本;

    我现在是在Windows窗体应用程序中使用库的过程,仍然需要访问控制台输出。(显示在列表/rich文本框中)

    我注意到我可以将控制台外的标准重写为一个文本编写器,但是我将如何将这些数据放入显示中。

    我试着按照

      public partial class Form1 : Form
      {
        Timer T;
        MemoryStream mem;
        StreamWriter writer; 
    
    
        public Form1()
        {
    
            InitializeComponent();
            mem = new MemoryStream(1000);
            writer = new StreamWriter(mem);
            Console.SetOut(writer);
    
            T = new Timer();
            T.Interval = 250; // yes this probally is to short.
            T.Tick += new EventHandler(T_Tick);
            T.Start();
    
    
            Console.WriteLine("output");
            Console.WriteLine("AnotherLine");
        }
    
        void T_Tick(object sender, EventArgs e)
        {
            string s = Encoding.Default.GetString(mem.ToArray());
            string[] Lines = s.Split(Environment.NewLine.ToCharArray());
            Output.Items.Clear(); // Output is a listbox 
            foreach (string str in Lines)
                Output.Items.Add(str);
        }
    }
    

    但无济于事。有什么想法吗?

    删除了不需要的代码。

    2 回复  |  直到 15 年前
        1
  •  12
  •   Michael Petrotta user3140870    15 年前

    另一种可能更简单的方法是使用自己的文本编写器将日志扩展到您希望的任何位置。

    注意:我没有测试过这个。

    public class ListBoxWriter : TextWriter
    {
        private ListBox list;
        private StringBuilder content = new StringBuilder();
    
        public ListBoxWriter(ListBox list)
        {
            this.list = list;
        }
    
        public override void Write(char value)
        {
            base.Write(value);
            content.Append(value);
            if (value == '\n')
            {
                list.Items.Add(content.ToString());
                content = new StringBuilder();
            }
        }
    
        public override Encoding Encoding
        {
            get { return System.Text.Encoding.UTF8; }
        }
    }
    
        2
  •  3
  •   Andy West    15 年前

    我不会尝试“捕获”发送到控制台的文本,而是创建一个处理为您编写输出的新类。然后这个新类可以写入控制台,以及您希望它转到的任何其他地方。

    如果您使用的是.NET的调试类,只需使用两个监听器:consoletraceListener和textWriterTraceListener。

    要使现有代码正常工作,请添加:

    writer.Flush();
    

    在console.writeline()调用之后。