簡體   English   中英

如何從另一個具有void方法的類更新表單中的標簽?

[英]c# How can I update a label within a form from another class that has a void method?

現在,我有一個帶有標簽的表格,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是無效方法。 我認為將其保留為十進制將僅向表單返回一個值,而不會自動更新。 我應該嘗試在if語句中創建一個事件,以便它更改標簽嗎? 干杯

更新:我還應該注意,我的UDP偵聽器采用了txtName.Text中的字符串。 我可能必須異步運行它。 Update2:終於讓它工作了。 除了Rob的回答,我還必須調用它,因為我使UDPlistiner在另一個線程上運行

這里:

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;

假設您宣布標簽為公開

我建議稍微不同的方法。

UDPListener定義一個EventHandler並以您的主要形式訂閱該事件。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM