-1

我正在制作一个程序,它在主监视器上有一个表单,另一个在辅助监视器上。

我想用主表单中的变量值更新辅助表单中标签的内容。

现在我正在使用辅助表单中的计时器来执行此操作,该计时器从主表单读取变量并在变量更改时更新标签内容,但我想知道是否有更好的方法来执行此操作,而无需计时器这一直有效。

4

2 回答 2

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,但如果不是这种情况(打开 Form2 的是 Form1),则该过程要求您在 Form2 的构造函数中传递 Form1 的实例并使用该实例来连接事件

在 Form1 中

 Form2 newForm2 = new Form2(this);
 newForm2.Show();

在 Form2 的构造函数中

 public void Form2(Form1 callerInstance)
 {
      InitializaComponents();
      callerInstance.ImportantValueChanged += ReceiveNotificationForChange;
 }
于 2013-07-07T21:56:52.873 回答
0

在您的主表单代码中,不要使用变量来存储您的值,而是使用自动设置标签的属性:

private string _value;
private string Value {
  get { return _value; }
  set { 
    _value = value;
    if (secondForm != null) secondForm.lblValue.Text = value;
  }
}

然后,当您在主窗体中设置值时,使用Value = "blah blah";,属性设置器将为您更改标签。

于 2013-07-07T21:58:22.843 回答