
親画面のメソッドを、子画面から呼び出したい場合がある。
例えば、親画面が一覧画面で子画面が入力画面の場合、子画面で入力したデータを親画面のリストに反映させたい場合。
概要
子画面を「ShowDialog()」メソッドを使用して表示しているなら、親画面の一覧表示処理のメソッドを「ShowDialog()」メソッドの直後に書けばよいが、仕様的に画面すべてがそれぞれ独立したプロジェクトのDLLファイルという場合がある。
このとき、親画面と子画面のつながりは何もない。
子画面を閉じるときに、親画面の一覧を再表示したい場合は、デリゲートを使用する。
親画面でのデリゲートの宣言
まず、親画面のソースにデリゲートを宣言する。
宣言文を記述する場所は、名前空間とフォームのクラス宣言の間。
1 2 3 4 5 6 |
namespace Test { public delegate void Refresh(); // ←ここに書く public partial class frmMain { |
子画面表示処理
デリゲートの形名「Refresh」は、引数と戻り値のないメソッドを入れるため、戻り値にvoid、()で引数なしと記述(実際に入れるメソッドに合わせること)。
※型名は任意の名前をつけてください。
Refreshのコンストラクタに渡している「DispData」はメソッド名で、このメソッドが親画面の一覧を更新する。
1 2 3 4 |
// 子画面表示処理 Refresh rf = new Refresh(this.DispData); //←DispDataは親画面にあるデータ取得表示処理 frmSub sub = new frmSub(rf); sub.Show(); |
子画面側の記述
「DispData」は子画面に渡すメソッド名(任意の名前)。
子画面はコンストラクタで、デリゲートを受け取る。
「デリゲートを受け取る」とは、親画面のメソッド「DispData」が格納されているアドレスを受け取るということ。
以下に子画面の記述を示す。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
namespace Test { public partial class frmSub { //親画面を受け取るためのフィールド public Refresh rf = null; //コンストラクタ public frmSub(Refresh pRefresh) { InitializeComponent(); rf = pRefresh; } // 閉じるボタン押下時の処理 private void btnClose_Click(object sender, EventArgs e) { // 親画面のメソッドをデリゲートで実行 rf(); this.Close(); } } } |
コメント
この記事へのトラックバックはありません。
この記事へのコメントはありません。