c# redirect user-interface console.writeline

c# - Redirigiendo Console.WriteLine() a Textbox



redirect user-interface (4)

Comience por crear un nuevo TextWriter que sea capaz de escribir en un cuadro de texto. Solo necesita anular el método de Write que acepta un char , pero eso sería muy ineficiente, por lo que es mejor sobrescribir al menos el método con una cadena.

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

En este caso, simplemente acepté un Control , que podría ser un Textbox , una Label o lo que sea. Si desea cambiarlo a solo una Label que estaría bien.

Luego simplemente configure la salida de la consola a una nueva instancia de este escritor, apuntando a algún cuadro de texto o etiqueta:

Console.SetOut(new ControlWriter(textbox1));

Si desea que la salida se escriba en la consola , así como en el cuadro de texto, podemos usar esta clase para crear un escritor que escribirá a varios escritores:

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

Entonces usando esto podemos hacer:

Console.SetOut(new MultiTextWriter(new ControlWriter(textbox1), Console.Out));

Estoy creando esta aplicación en Visual Studio 2010 usando C #.

Básicamente hay 2 archivos, form1.cs (que es el formulario de Windows) y program.cs (donde reside toda la lógica).

//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."); } } }

Hay un botón Ejecutar y un cuadro de texto en blanco.

Cuando el usuario presiona el botón Ejecutar, program.cs realizará alguna tarea e imprimirá constantemente el progreso usando Console.WriteLine() en la consola (símbolo del sistema).

Pregunta: ¿Cómo puedo imprimir en el cuadro de texto en form1 en lugar de imprimir en el símbolo del sistema? Tendré que imprimir el progreso constantemente sin ninguna acción del usuario.

¡Gracias por adelantado!

Por cierto, no tiene que ser un cuadro de texto, puede ser una etiqueta u otra cosa que puede tomar texto. Elegí el cuadro de texto porque tiene más sentido para mí.


No sé si funcionará, pero podría intentar redirigir la salida de la consola.

Use Console.SetOut() y cree un derivado de TextWriter que reemplaza el método WriteLine() y simplemente asigne el parámetro del método a su TextBox.Text debería funcionar.


Yo uso algo como esto para un cuadro de lista:

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

y en mi aplicación principal:

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

Console.SetOut (_writer);


ponga el textbox de textbox en el formulario ( multiple lines habilitadas) o en el área de texto que puede hacer en su bucle

txtOutput.Text += "Progress " + percent + "% completed." + Environment.NewLine();