2009/05/27(Wed) 00:01:53 編集(投稿者)
# おっと、2003 でしたか。
# 回答にうっかり FormClosing イベントを使っていたので、1.1 向けのコードに書き直し…。
■No36285 (さんだ さん) に返信
> private void button1_Click(object sender, System.EventArgs e)
> {
> Form2 f = new Form2();
> f.BtnClick +=new EventHandler(f_BtnClick);
> f.ShowDialog(this);
> }
using ブロックを使ってください。ShowDialog で開いたフォームは、Dispose せねばなりませんので。
http://msdn.microsoft.com/ja-jp/library/c7ykbedk.aspx
using (Form2 f = new Form2())
{
f.BtnClick += new EventHandler(f_BtnClick);
f.ShowDialog(this);
}
> protected virtual void OnBtnClick()
> {
OnEventName メソッドは、EventArgs 継承クラスを引数に受け取るように実装する方が一般的かと。
> if(BtnClick != null)
> BtnClick(this,null);
> }
null を渡すべきではありません。せめて EventArgs.Empty を渡しましょう。
> どのように記述したらよいのでしょうか?
Form1 / Form2 それぞれの役割が記載されていないので、
どのように実装するのが適切かは答えにくいですが:
たとえば今のコードなら、sender に Form2 のインスタンスが入っているので、
それを使って Close する事ができます。
// Form1 側
((Form2)sender).Close();
もしくは、Form2 はダイアログとして呼ばれるようなので、デザイン時にあらかじめ
Form2 上のボタンの DialogResult プロパティを設定して、閉じるためのボタンとしての役目を
持たせておき、呼び出し元の Form1 側では、ダイアログを閉じるべきかどうかを、
// Form1 側
f.Closing += new CancelEventHandler(f_Closing);
のイベントの引数 e.Cancel で制御するとか。