C# 将控制台输出重定向到winforms列表框
我构建了一个库,它使用Console.WriteLine()转储大部分调试文本 我现在正在Windows窗体应用程序中使用库,并且仍然需要访问控制台输出。(显示在列表/文本框中) 我注意到我可以将控制台外的标准覆盖到TextWriter,但是如何将这些数据输入到显示器中呢 我试着按照C# 将控制台输出重定向到winforms列表框,c#,.net,winforms,console-redirect,C#,.net,Winforms,Console Redirect,我构建了一个库,它使用Console.WriteLine()转储大部分调试文本 我现在正在Windows窗体应用程序中使用库,并且仍然需要访问控制台输出。(显示在列表/文本框中) 我注意到我可以将控制台外的标准覆盖到TextWriter,但是如何将这些数据输入到显示器中呢 我试着按照 public partial class Form1 : Form { Timer T; MemoryStream mem; StreamWriter writer;
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);
}
}
但是没有用。有什么想法吗
删除不需要的代码 与其尝试“捕获”发送到控制台的文本,不如创建一个新类来处理为您编写输出的问题。然后,这个新类可以写入控制台,以及您希望它去的任何其他地方
如果您使用的是.NET的调试类,只需使用两个侦听器:一个ConsoleTraceListener和一个TextWriterTraceListener
要使现有代码正常工作,请添加:
writer.Flush();
在您的Console.WriteLine()调用之后 另一种可能更干净的方法是使用您自己的TextWriter扩展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; }
}
}
如果我找不到解决这个问题的办法,我很可能最终会这样做。但我真的更愿意通过访问控制台来实现这一点(主要是作为一种易于使用的东西),但也作为一种教育性的东西。这是我确信我将来可以找到多种用途的东西,所以现在学习如何使用它将非常方便。我已经忘记了调试类的存在,我可能只是转换位来使用它。在这种情况下,要使代码正常工作,只需添加:writer.Flush();在你的控制台之后。WriteLine()调用。这正是我想要的:D谢谢