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.
Use Console. SetOut() and create derivative of TextWriter which overrides WriteLine() method and simply assign method parameter to your TextBox. Text Should work.
Writes the text representation of the specified objects, followed by the current line terminator, to the standard output stream using the specified format information.
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.
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.
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));
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);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With