5

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

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

我注意到我可以将标准从控制台覆盖到 TextWriter,但是我如何将这些数据输入到 display 中。

我尝试按照以下方式做一些事情

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

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

删除了不需要的代码。

4

2 回答 2

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; }
    }
}
于 2009-11-23T01:07:32.833 回答
3

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

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

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

writer.Flush();

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

于 2009-11-23T00:57:10.290 回答