c# 如何从另一个具有 void 方法的 class 更新表单中的标签?
c# How can I update a label within a form from another class that has a void method?
现在,我有一个带有标签 lblHeartBeat 的表单。我有一个 UDP 侦听器,它接收具有 lblHeartBeat 值的数据。我想知道,如何使用我的 UDP 客户端从另一个 class 实时更改标签?
现在我有
private void btnBopIt_Click(object sender, EventArgs e)
{
string name;
name=txtName.Text;
UDPListener myListener=new UDPListener();
myListener.GetData(name);
}
我的 class 与 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 方法。我认为将它设置为十进制只会 return 一个表单值,而不是自动更新。我是否应该尝试在 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;
假设您将标签声明为 public
我会建议稍微不同的方法。
在 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;
}
现在,我有一个带有标签 lblHeartBeat 的表单。我有一个 UDP 侦听器,它接收具有 lblHeartBeat 值的数据。我想知道,如何使用我的 UDP 客户端从另一个 class 实时更改标签?
现在我有
private void btnBopIt_Click(object sender, EventArgs e)
{
string name;
name=txtName.Text;
UDPListener myListener=new UDPListener();
myListener.GetData(name);
}
我的 class 与 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 方法。我认为将它设置为十进制只会 return 一个表单值,而不是自动更新。我是否应该尝试在 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;
假设您将标签声明为 public
我会建议稍微不同的方法。
在 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;
}