我正在制作一个程序,在主监视器上有一个表单,另一个在辅助监视器上。
我希望使用主窗体中变量的值更新辅助表单中标签的内容。
现在,我正在使用辅助表单中的计时器来读取主表单中的变量,并在变量更改时更新标签内容,但我想知道是否有更好的方法来执行此操作,没有一直在工作的计时器。
答案 0 :(得分:2)
事件的来源(变量更改其值)是主要形式。因此,有责任通知每个外部实体(第二种形式)该值已被更改。
按照这种思路,您应该在主要表单中实现一个事件,并让变量更改时通知其他实体订阅此事件
在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,但如果不是这种情况(Form1打开Form2),则该过程要求您在Form2的构造函数中传递Form1的实例并使用该实例连接事件
在Form1中
Form2 newForm2 = new Form2(this);
newForm2.Show();
在Form2的构造函数中
public void Form2(Form1 callerInstance)
{
InitializaComponents();
callerInstance.ImportantValueChanged += ReceiveNotificationForChange;
}
答案 1 :(得分:0)
在主表单代码中,使用自动设置标签的属性,而不是使用变量来存储您的值:
private string _value;
private string Value {
get { return _value; }
set {
_value = value;
if (secondForm != null) secondForm.lblValue.Text = value;
}
}
然后,当您在主窗体中设置值时,使用Value = "blah blah";
进行设置,属性设置器将为您更改标签。