イベントとイベントハンドラーは好きなように割り当てることができます。ここにいくつかのサンプルコードがあります。ボタンとラベルが付いた2つのフォームがあります。Form2には、tesxtを入力できるテキストボックスがあります。Form2のボタンをクリックすると、ラベルテキストが変更され、Form1によって取得されたイベントが発生します。次に、Form1のラベルがForm2のラベルと一致するように変更されます。
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Form2 dlg = new Form2();
dlg.NameChanged += OnNameChanged;
dlg.ShowDialog();
}
private void OnNameChanged(object sender, NameChangeEventArgs args)
{
this.label1.Text=args.NewName;
}
}
public class NameChangeEventArgs : EventArgs
{
public NameChangeEventArgs(string name)
{
this.NewName=name;
}
public string NewName{get;private set;}
}
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
label1.Text = textBox1.Text;
if (this.NameChanged != null)
{
this.NameChanged(this, new NameChangeEventArgs(label1.Text));
}
}
public event EventHandler<NameChangeEventArgs> NameChanged;
}
}
編集-申し訳ありませんが、あなたの質問を正しく読みませんでした。
これを避けたい場合
Form2 dlg = new Form2();
dlg.NameChanged += OnNameChanged;
dlg.ShowDialog();
次に、Form2コンストラクターを次のように変更できます。
public Form2(EventHandler<NameChangeEventArgs> eventhandler)
{
InitializeComponent();
NameChanged += eventhandler;
}
次に、Form2を次のように設定して表示します。
Form2 dlg = new Form2(OnNameChanged);
dlg.ShowDialog();
+=
残念ながら、親クラスがインスタンス化されたらイベントハンドラーを割り当てる必要があるため、イベントハンドラーを割り当てる際にステートメントを回避する方法が実際にあります。もちろん、ダイアログを一度インスタンス化して、必要になるまで表示しないこともできますが、ダイアログが閉じられて破棄されることに対処する必要があります。つまり、ShowDialogを使用せず、代わりにShowを使用して、コードを配置して、ダイアログはモーダルのままです。