2009-11-23 17 views
5

He creado una biblioteca que descarga la mayor parte de su texto de depuración usando Console.WriteLine();Redirigir la salida de la consola a winforms ListBox

Ahora estoy en proceso de usar la biblioteca en una aplicación de Windows Forms, y aún necesito acceso a la salida de la consola. (Para mostrar en un cuadro de lista/texto enriquecido)

Me di cuenta de que puedo anular el estándar de la consola a un TextWriter, pero ¿cómo puedo obtener estos datos en la pantalla.

He intentado hacer algo en la línea de

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

pero fue en vano. ¿Algunas ideas?

Se eliminó el código no deseado.

Respuesta

12

Otra forma, probablemente más limpia de hacer esto, es extender TextWriter con los suyos propios, que se registren donde usted desee.

Nota: No he probado esto.

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

esto hace exactamente lo que im: D Gracias – Fusspawn

3

En lugar de tratar de "capturar" el texto enviado a la consola, crearía una nueva clase que maneje la escritura de la salida por usted. Entonces, esa nueva clase podría escribir en la consola, así como en cualquier otro lugar donde quieras que vaya.

Si está utilizando la clase Debug de .NET, simplemente use dos oyentes: ConsoleTraceListener y TextWriterTraceListener.

Para hacer su trabajo de código existente, añadir:

writer.Flush(); 

después de su Console.WriteLine() llama.

+0

si no puedo encontrar una solución a esto, lo más probable es que termine haciéndolo de esa manera. pero preferiría hacerlo accediendo a la consola, (principalmente como una cosa fácil de usar), pero también como una pieza educativa. es algo de lo que estoy seguro que puedo encontrar usos múltiples en el futuro, así que aprender cómo hacerlo ahora será bastante útil. – Fusspawn

+0

mientras no estoy usando la clase de depuración (no es toda la información de depuración). Había olvidado la existencia de esa clase Debug, solo puedo convertir bits para usar eso. – Fusspawn

+0

Ok. En ese caso, para que su código funcione, simplemente agregue: writer.Flush(); después de sus llamadas Console.WriteLine(). –

Cuestiones relacionadas