我正在制作一个程序,它在主监视器上有一个表单,另一个在辅助监视器上。
我想用主表单中的变量值更新辅助表单中标签的内容。
现在我正在使用辅助表单中的计时器来执行此操作,该计时器从主表单读取变量并在变量更改时更新标签内容,但我想知道是否有更好的方法来执行此操作,而无需计时器这一直有效。
我正在制作一个程序,它在主监视器上有一个表单,另一个在辅助监视器上。
我想用主表单中的变量值更新辅助表单中标签的内容。
现在我正在使用辅助表单中的计时器来执行此操作,该计时器从主表单读取变量并在变量更改时更新标签内容,但我想知道是否有更好的方法来执行此操作,而无需计时器这一直有效。
事件的来源(改变其值的变量)是主要形式。因此,它有责任通知每个外部实体(第二种形式)该值已更改。
按照这种思路,您应该在主要表单中实现一个事件,并让其他实体订阅此事件,以便在变量更改时得到通知
在 Form1(主窗体)中
public delegate void OnVeryImportantValueChanged(int newValue);
public event OnVeryImportantValueChanged ImportantValueChanged;
当你更改重要值的值时,检查是否有人订阅了该事件,如果是肯定的,则调用事件处理程序
importantValue = CalculateNewValue();
if(ImportantValueChanged != null)
ImportantValueChanged(importantValue);
在 Form2(次要形式)中
Form1 newForm1 = new Form1();
newForm1.ImportantValueChanged += ReceiveNotificationForChange;
newForm1.Show();
public void ReceiveNotificationForChange(int newValue)
{
label.Text = "NewValue received:" + newValue.ToString();
}
在上述场景中,Form2 打开 Form1,但如果不是这种情况(打开 Form2 的是 Form1),则该过程要求您在 Form2 的构造函数中传递 Form1 的实例并使用该实例来连接事件
在 Form1 中
Form2 newForm2 = new Form2(this);
newForm2.Show();
在 Form2 的构造函数中
public void Form2(Form1 callerInstance)
{
InitializaComponents();
callerInstance.ImportantValueChanged += ReceiveNotificationForChange;
}
在您的主表单代码中,不要使用变量来存储您的值,而是使用自动设置标签的属性:
private string _value;
private string Value {
get { return _value; }
set {
_value = value;
if (secondForm != null) secondForm.lblValue.Text = value;
}
}
然后,当您在主窗体中设置值时,使用Value = "blah blah";
,属性设置器将为您更改标签。