我已经构建了一个库,它使用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);
}
}
但无济于事。有任何想法吗?
删除了不需要的代码。
答案 0 :(得分:12)
另一种可能更简洁的方法是使用您自己的日志将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; }
}
}
答案 1 :(得分:3)
我会创建一个处理为您编写输出的新类,而不是尝试“捕获”发送到控制台的文本。然后,新类可以写入控制台,以及您希望它去的任何其他地方。
如果您使用的是.NET的Debug类,只需使用两个侦听器:ConsoleTraceListener和TextWriterTraceListener。
要使现有代码生效,请添加:
writer.Flush();
在您的Console.WriteLine()调用之后。