2009-11-23 11 views
5

Ho creato una libreria che scarica la maggior parte del suo testo di debug usando Console.WriteLine();Reindirizzare l'output della console alle winform ListBox

Ora sono il processo di utilizzo della libreria in un'applicazione Windows Form e ancora accesso all'output della console. (Da visualizzare in una casella List/RichText)

I Notato Posso ignorare lo standard dalla console a un TextWriter, ma come potrei quindi ottenere questi dati sul display.

Ho provato a fare qualcosa sulla falsariga di

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

ma senza alcun risultato. Qualche idea?

Codice non necessario rimosso.

risposta

12

Un altro, probabilmente, un modo più semplice per farlo è estendere TextWriter con i propri registri ovunque desideri.

Nota: non l'ho ancora testato.

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

questo fa esattamente quello che ho dopo: D Grazie – Fusspawn

3

Piuttosto che cercare di "catturare" il testo inviato alla console, vorrei creare una nuova classe che gestisca la scrittura dell'output per te. Quindi quella nuova classe potrebbe scrivere sulla console, oltre a qualsiasi altra destinazione tu voglia che vada.

Se si utilizza la classe di debug di .NET, è sufficiente utilizzare due listener: un ConsoleTraceListener e un TextWriterTraceListener.

Per rendere il vostro lavoro codice esistente, aggiungere:

writer.Flush(); 

dopo vostro Console.WriteLine() chiama.

+0

se non trovo una soluzione a questo, molto probabilmente finirò per farlo in quel modo. ma preferirei farlo attraverso l'accesso alla console, (principalmente come una cosa facile da usare), ma anche come un pezzo educativo. è qualcosa di cui sono sicuro di poter trovare molteplici utilizzi per il futuro, quindi imparare a farlo ora sarà piuttosto utile. – Fusspawn

+0

mentre non sto usando la classe di debug (non tutte le informazioni di debug). Avevo dimenticato l'esistenza di quella classe Debug, potevo semplicemente convertire i bit per usarli. – Fusspawn

+0

Ok. In tal caso, per far funzionare il tuo codice, aggiungi: writer.Flush(); dopo le chiamate a Console.WriteLine(). –

Problemi correlati