将控制台输出重定向到winforms ListBox

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

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

我注意到我可以将控制台的标准覆盖到TextWriter,但是如何将这些数据放入显示器中。

我试着做一些事情

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); } } 

但无济于事。 有任何想法吗?

删除了不需要的代码。

另一种可能更简洁的方法是使用您自己的日志将TextWriter扩展到您希望的任何位置。

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

 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; } } } 

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

如果您使用的是.NET的Debug类,只需使用两个侦听器:ConsoleTraceListener和TextWriterTraceListener。

要使现有代码有效,请添加:

 writer.Flush(); 

在您的Console.WriteLine()调用之后。