c#如何从另一个具有void方法的类更新表单中的标签?

时间:2016-06-03 04:02:06

标签: c# user-interface events udp

现在,我有一个带有标签的表单lblHeartBeat。我有一个UDP侦听器,它接收带有lblHeartBeat值的数据。我想知道,如何使用我的UDP客户端从另一个类实时更改标签?

现在我有

private void btnBopIt_Click(object sender, EventArgs e)
{
    string name;
    name=txtName.Text;
    UDPListener myListener=new UDPListener();
    myListener.GetData(name);
}

我的UDP客户端部分是:

public class UDPListener
{
public void GetData(string Name)
...
while (!done)
{
    byte[] bytes = listener.Receive(ref groupEP);
    var result = Encoding.ASCII.GetString(bytes, 0, bytes.Length);
    var data = result.Split(',')
        .Select(x => x.Trim().Split('='))
        .ToDictionary(x => x[0], x => x[1]);

    string myFunString = result.ToString();

    if (myFunString.Contains(Name) == true && myFunString.Contains("Heartbeat"))
    {
       decimal value=data["Hearbeat"] 
       //I'd like to have it some way below that:
       form1.lblHeartbeat=value;
    }
}

请注意,我的UDPlistener是一个void方法。我认为有十进制只会返回一个值到表单,而不是autoupdate。我应该尝试在if语句中创建一个事件,以便更改标签吗?干杯

更新:我还应该注意,我的UDP侦听器接受来自txtName.Text的字符串。我可能不得不异步运行它。 Update2:终于搞定了。除了Rob的回答之外,我必须调用它,因为我使UDPlistiner在不同的线程上运行

2 个答案:

答案 0 :(得分:0)

下面:

UDPListener myListener=new UDPListener();

您应该传递表单或您感兴趣的特定标签。然后您的UDPListener将能够引用表单及其控件。例如:

private void btnBopIt_Click(object sender, EventArgs e)
{
    UDPListener myListener = new UDPListener(this);
}

public class UDPListener 
{
    private Form1 _form { get; set; }
    public UDPListener (Form1 form) //Assuming your form class is `Form1`
    {
        _form = form;
    }

    //..

}

然后你可以这样写:

_form.lblHeartbeat.Text = value;

假设您将标签声明为 public

答案 1 :(得分:0)

我建议略有不同的方法。

EventHandler中定义UDPListener并在主表单中订阅该事件。

public class UDPListener
{
     public event Action<string> MessageReceived;

     ...         
}

在您的(while)循环中修改您的代码以通知听众。

 if (myFunString.Contains(Name) == true && myFunString.Contains("Heartbeat"))
 {
      decimal value=data["Hearbeat"] 
      //I'd like to have it some way below that:
      if(MessageReceived != null) MessageReceived(value); 
 }

最后一步,在Form1

中订阅此活动
private void btnBopIt_Click(object sender, EventArgs e)
{
     UDPListener myListener=new UDPListener();
     myListener.MessageReceived += (s) => lblHeartbeat.Text = s;
}