将生成的值从类发送到文本框

时间:2018-07-12 09:28:52

标签: c# winforms

我有一个库,可以为名为MessageOut的函数生成字符串。此功能,我无法更改其结构。

它看起来像这样:

public void MessageOut(string msg) //params or return-type cannot be changed
{
    Console.WriteLine(msg);       
}

我的表单中有一个文本框,希望在其中显示此消息。

如何将msg附加到该文本框?

我尝试过:

public void MessageOut(string msg) //params or return-type cannot be changed
{
    Console.WriteLine(msg);
    sendMessageTextBox(msg);       
}

public string[] sendMessageTextBox(params string[] msg)
{ 
     string send = "";
     foreach(var i in msg){send = i;}
     return send;
}

表格:

private void getWaveformBtn_Click(object sender, EventArgs e)
{
     MyClass className = new MyClass();
     foreach(var i in className.sendMessageTextBox())
     {
          errorTextBox.Text += i;
     }
}

出于明显的原因,这不起作用,但是我不确定如何去做。 (我尝试过:how to send text to textbox through a different class?

Sending information to a textbox from a class to a form

但是,我似乎无法获得这些解决方案。

非常感谢您的帮助。

TL; DR-我基本上想在文本框中显示messageOut收到的新字符串

1 个答案:

答案 0 :(得分:0)

这可以通过不同的方式来完成,其中之一是使用队列,从MessageOut中填充队列,并在按下按钮时将其耗尽。

public class MessageHandler /* , MessageOutInterface */
{
    private readonly Queue<string> messages;

    public MessageHandler()
    {
        this.messages = new Queue<string>();
    }

    public void MessageOut(string message)
    {
        this.messages.Enqueue(message);
    }

    public IEnumerable<string> PendingMessages() 
    {
        string message;
        while (this.messages.Count > 0)
            yield return this.messages.Dequeue();
    }
}

您的用户界面代码

private void getWaveformBtn_Click(object sender, EventArgs e)
{
     foreach(var i in messageHandler.PendingMessages())
     {
          errorTextBox.Text += i;
     }
}

如果在一个线程(即不是主线程)上调用MessageOut,并且显然在主线程上发生了按钮按下操作,则需要一种线程安全的方法:

public class MessageHandler /* , MessageOutInterface */
{
    private readonly object syncRoot = new Object();
    private readonly Queue<string> messages;

    public MessageHandler()
    {
        this.messages = new Queue<string>();
    }

    public void MessageOut(string message)
    {
        lock (this.syncRoot)
        {
            this.messages.Enqueue(message);
        }
    }

    public IEnumerable<string> PendingMessages() 
    {
        lock (this.syncRoot)
        {
            var pending = this.messages.ToArray();
            this.messages.Clear();
            return pending;
        }
    }
}

这不是同步线程的最佳方法,但是您可以问另一个有关同步的问题。