将Console.WriteLine()重定向到文本框

sor*_*419 23 c# user-interface redirect console.writeline

我正在使用C#在Visual Studio 2010中构建此应用程序.

基本上有2个文件,form1.cs(这是windows窗体)和program.cs(所有逻辑都在这里).

//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.");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有一个运行按钮和一个空白文本框.

当用户点击"运行" 按钮时,program.cs将执行一些任务并使用Console.WriteLine()控制台(命令提示符)不断打印进度.

问题:如何打印到form1上的文本框而不是打印到命令提示符?我需要在没有任何用户操作的情况下持续打印进度.

提前致谢!

顺便说一句,它不必是文本框,它可以是标签或其他可以采用文本的东西.我选择了文本框,因为它对我来说更有意义.

Ser*_*rvy 53

首先创建一个TextWriter能够写入文本框的新内容.它只需要覆盖Write接受a 的方法char,但这样效率很低,所以最好用字符串覆盖至少方法.

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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我只是接受了一个Control,可能是a Textbox,a Label,或者其他什么.如果你想把它改成一个没问题Label.

然后只需将控制台输出设置为此writer的新实例,指向一些文本框或标签:

Console.SetOut(new ControlWriter(textbox1));
Run Code Online (Sandbox Code Playgroud)

如果您希望将输出写入控制台以及文本框,我们可以使用此类创建将写入多个编写器的编写器:

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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后用这个我们可以做到:

Console.SetOut(new MultiTextWriter(new ControlWriter(textbox1), Console.Out));
Run Code Online (Sandbox Code Playgroud)