Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Redirecting Console.WriteLine() to Textbox

I'm building this application in Visual Studio 2010 using C#.

Basically there are 2 files, form1.cs (which is the windows form) and program.cs (where all the logic lies).

//form1.cs public partial class Form1 : Form {     //runButton_click function }  //program.cs class Program {     static void Main()     {         while(blah-condition)         {             //some calculation             Console.WriteLine("Progress " + percent + "% completed.");         }     } } 

There is a Run button and a blank textbox.

When the user hits the Run button, program.cs will perform some task and constantly printing out the progress using Console.WriteLine() onto the console (command prompt).

Question: How can I print to the textbox on form1 instead of printing into command prompt? I will need to print the progress constantly without any user action.

Thanks in advance!

By the way, it doesn't have to be a textbox, it can be a label or something else that can take text. I chose textbox because it makes more sense to me.

like image 719
sora0419 Avatar asked Sep 10 '13 19:09

sora0419


People also ask

How redirect the console's output to a TextBox in C#?

Use Console. SetOut() and create derivative of TextWriter which overrides WriteLine() method and simply assign method parameter to your TextBox. Text Should work.

What is use of console WriteLine () method?

Writes the text representation of the specified objects, followed by the current line terminator, to the standard output stream using the specified format information.

How do I print from console WriteLine?

To print a message to the console, we use the WriteLine method of the Console class. The class represents the standard input, output, and error streams for console applications. Note that Console class is part of the System namespace. This line was the reason to import the namespace with the using System; statement.

How do you print to the console in C#?

In C# you can write or print to console using Console. WriteLine() or Console. Write(), basically both methods are used to print output of console.


2 Answers

Start by creating a new TextWriter that is capable of writing to a textbox. It only needs to override the Write method that accepts a char, but that would be ungodly inefficient, so it's better to overwrite at least the method with a string.

public class ControlWriter : TextWriter {     private Control textbox;     public ControlWriter(Control textbox)     {         this.textbox = textbox;     }      public override void Write(char value)     {         textbox.Text += value;     }      public override void Write(string value)     {         textbox.Text += value;     }      public override Encoding Encoding     {         get { return Encoding.ASCII; }     } } 

In this case I've had it just accept a Control, which could be a Textbox, a Label, or whatever. If you want to change it to just a Label that would be fine.

Then just set the console output to a new instance of this writer, pointing to some textbox or label:

Console.SetOut(new ControlWriter(textbox1)); 

If you want the output to be written to the console as well as to the textbox we can use this class to create a writer that will write to several writers:

public class MultiTextWriter : TextWriter {     private IEnumerable<TextWriter> writers;     public MultiTextWriter(IEnumerable<TextWriter> writers)     {         this.writers = writers.ToList();     }     public MultiTextWriter(params TextWriter[] writers)     {         this.writers = writers;     }      public override void Write(char value)     {         foreach (var writer in writers)             writer.Write(value);     }      public override void Write(string value)     {         foreach (var writer in writers)             writer.Write(value);     }      public override void Flush()     {         foreach (var writer in writers)             writer.Flush();     }      public override void Close()     {         foreach (var writer in writers)             writer.Close();     }      public override Encoding Encoding     {         get { return Encoding.ASCII; }     } } 

Then using this we can do:

Console.SetOut(new MultiTextWriter(new ControlWriter(textbox1), Console.Out)); 
like image 66
Servy Avatar answered Sep 19 '22 18:09

Servy


I use sth like this for a listbox:

    public class ListBoxWriter : TextWriter //this class redirects console.writeline to debug listbox {     private readonly ListBox _list;     private StringBuilder _content = new StringBuilder();      public ListBoxWriter(ListBox list)     {         _list = list;     }      public override Encoding Encoding     {         get { return Encoding.UTF8; }     }     public override void Write(char value)     {         base.Write(value);         _content.Append(value);          if (value != '\n') return;         if (_list.InvokeRequired)         {             try             {                 _list.Invoke(new MethodInvoker(() => _list.Items.Add(_content.ToString())));                 _list.Invoke(new MethodInvoker(() => _list.SelectedIndex = _list.Items.Count - 1));                 _list.Invoke(new MethodInvoker(() => _list.SelectedIndex = -1));             }             catch (ObjectDisposedException ex)             {                 Console.WriteLine(Resources.Exception_raised + " (" + ex.Message + "): " + ex);             }         }         else         {             _list.Items.Add(_content.ToString());             _list.SelectedIndex = _list.Items.Count - 1;             _list.SelectedIndex = -1;         }         _content = new StringBuilder();     } } 

and in my main application:

_writer = new ListBoxWriter(DebugWin); // DebugWin is the name og my listbox 

Console.SetOut(_writer);

like image 34
user38723 Avatar answered Sep 16 '22 18:09

user38723