メインモニターにフォームがあり、セカンダリモニターに別のフォームがあるプログラムを作成しています。
メイン フォームの変数の値で更新されたセカンダリ フォームのラベルの内容を維持したいと考えています。
現在、メインフォームから変数を読み取り、変数が変更されたときにラベルの内容を更新するセカンダリフォームのタイマーでそれを行っていますが、タイマーなしでこれを行うためのより良い方法があるかどうか知りたいと思っていましたそれは常に働いています。
メインモニターにフォームがあり、セカンダリモニターに別のフォームがあるプログラムを作成しています。
メイン フォームの変数の値で更新されたセカンダリ フォームのラベルの内容を維持したいと考えています。
現在、メインフォームから変数を読み取り、変数が変更されたときにラベルの内容を更新するセカンダリフォームのタイマーでそれを行っていますが、タイマーなしでこれを行うためのより良い方法があるかどうか知りたいと思っていましたそれは常に働いています。
イベントのソース (値を変更する変数) は、プライマリ フォームです。したがって、この値が変更されたことをすべての外部エンティティ (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 です)、プロセスでは Form1 のインスタンスを Form2 のコンストラクター内に渡し、そのインスタンスを使用してイベントを配線する必要があります。
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";
と、プロパティ セッターがラベルを変更します。