it-swarm.com.de

Umleiten von Console.WriteLine () zu Textbox

Ich baue diese Anwendung in Visual Studio 2010 mit C #.

Grundsätzlich gibt es 2 Dateien, form1.cs (was das Windows-Formular ist) und program.cs (wo die gesamte Logik liegt).

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

Es gibt eine Run Taste und eine leere Textbox .

Wenn der Benutzer den Run button drückt, führt program.cs einige Aufgaben aus und druckt den Fortschritt mit Console.WriteLine() ständig auf die Konsole (Befehlsaufforderung).

Frage: Wie kann ich in Form1 in das Textfeld drucken, anstatt in der Eingabeaufforderung zu drucken? Ich muss den Fortschritt ohne Benutzeraktion ständig drucken.

Danke im Voraus!

Übrigens muss es kein Textfeld sein, es kann eine Beschriftung oder etwas anderes sein, das Text aufnehmen kann. Ich habe Textbox gewählt, weil es für mich sinnvoller ist.

18
sora0419

Erstellen Sie zunächst eine neue TextWriter, die in ein Textfeld schreiben kann. Nur muss die Write-Methode überschreiben, die eine char akzeptiert, aber das wäre unglücklich ineffizient, daher ist es besser, zumindest die Methode mit einem String zu überschreiben.

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 diesem Fall habe ich einfach eine Control akzeptiert, die eine Textbox, eine Label oder was auch immer sein könnte. Wenn Sie es in nur eine Label ändern möchten, wäre das in Ordnung.

Setzen Sie dann die Konsolenausgabe auf eine neue Instanz dieses Schreibers und zeigen Sie auf ein Textfeld oder eine Bezeichnung:

Console.SetOut(new ControlWriter(textbox1));

Wenn Sie möchten, dass die Ausgabe in die Konsole geschrieben wird sowie in das Textfeld, können Sie diese Klasse verwenden, um einen Writer zu erstellen, der an mehrere Writer schreibt:

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

Dann können wir dies tun:

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

Ich benutze etw so für eine 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();
    }
}

und in meiner Hauptanwendung:

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

Console.SetOut (_writer);

2
user38723

Ich weiß nicht, ob es funktioniert, aber Sie könnten versuchen, die Konsolenausgabe umzuleiten.

Verwenden Sie Console.SetOut() und erstellen Sie eine Ableitung von TextWriter, die die WriteLine()-Methode überschreibt, und weisen Sie dem TextBox.Text.__ einfach Methodenparameter zu. Sollte funktionieren.

0
quirell