Перенаправление вывода на консоль в winforms ListBox

Я построил библиотеку, которая выводит большую часть своего текста отладки, используя Console.WriteLine();

Сейчас я нахожусь в процессе использования библиотеки в приложении Windows Forms, и мне по-прежнему нужен доступ к выходным данным консоли. (Для отображения в окне списка /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);
    }
}

но безрезультатно. Есть идеи?

Ненужный код удален.

2 ответа

Решение

Другой, возможно, более чистый способ сделать это - расширить 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().

Другие вопросы по тегам