- PR -

複数フォームの閉じ方について

1
投稿者投稿内容
ten
常連さん
会議室デビュー日: 2003/07/07
投稿数: 24
投稿日時: 2003-08-21 14:55
今、C#.NET2002を使用して帳票を作成したのですが、親画面から子画面を表示させることはできたのですが、子画面から子画面と親画面を同時に閉じる方法を教えてください。
例としては、Form1より子画面Form2を開き、Form2よりその子画面Form3を開いた状態です。Form3の終了ボタンを押した際に、Form3及びForm2を同時に閉じたです。
※Showdialogで表示しております。
宜しくお願いします!
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-08-21 15:41
こんにちは。

 Form3のプロパティとしてParentFormなどを作り、Form2から開くときに参照設定します。Form3のClosingイベントで、ParentFormがnull(Nothing)でなければ、Closeメソッドを呼び出して閉じます。
#未確認
ten
常連さん
会議室デビュー日: 2003/07/07
投稿数: 24
投稿日時: 2003-08-21 16:07
ご返答ありがとうございました。
質問の仕方が悪かったみたいなので、時間がありましたらもう一度返答をお願いします。
form3で
this.btnPreview.Click += new System.EventHandler(this.OnClose);

private void OnClose(object sender, System.EventArgs e)
{
form2 m_form2 = new form2();
//送りFORMを閉じる
form2.Close();
}
を行っているのですができません。
宜しくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-08-21 16:43
 Form2からForm3を表示しているんですよね?では、Form3.OnClose()でnewしているm_form2は、いったい何を指すでしょう?Form3を表示させたフォームのインスタンスではなく、そこで作った全く新しいインスタンスですよね。言うなれば親フォームのコピーであって、親フォームそのものではありません。ですから、『Form3のプロパティとしてParentFormなどを作り、Form2から開くときに参照設定します。』と書いたとおり、Form2で、「私があなたの親だよ」ということを知らせてあげないといけません。

 サンプル書いたのですが、自分で考える方がいいかと思って消したんですよ。もう一回書きますね。先のアルゴリズムと照らしてください。
#VB.NETですので、適宜読み替えてください

Public Class Form2 Inherits Form
''
Protected Sub Button1_Click(...) Handles Button1.Click
Dim frm3 As New Form3 ' 作って
frm3.ParentForm = Me ' 親を知らせる
frm3.ShowDialog() ' 表示
End Sub
''
End Class

Public Class Form3 Inherits Form
Private pParentForm As Form
Public Property ParentForm() As Form
Get
Return pParentForm
End Get
Set
pParentForm = Value
End Set
End Property
''
Public Sub New()
pParentForm = Nothing ' 初期化
''
End Sub
''
Protected Sub Form3_Close(...) Handles Form3.Close
If Not pParentForm Is Nothing Then pParentForm.Close ' 親を閉じる
End Sub
End Class

 考えながらここに直接打ち込んでいます。そのままコピーしても動作しないと思うので、挙動のみ、みてください。

 まずいところ発見。Form3表示中にForm2を閉じると、Form3を閉じたときにどうなるでしょうかねぇ?Form3が開いている間、Form2は閉じられないようにガードしますか??

[ メッセージ編集済み 編集者: Jitta 編集日時 2003-08-21 16:44 ]
dai
ベテラン
会議室デビュー日: 2001/08/28
投稿数: 85
投稿日時: 2003-08-21 18:10
Form2 の中で Form3 を ShowDialog しているのですよね?
単純に、ShowDialog の戻り値を見て、Form2が自分自身をCloseすればいいのでは?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-08-21 18:53
引用:

daiさんの書き込み (2003-08-21 18:10) より:
Form2 の中で Form3 を ShowDialog しているのですよね?
単純に、ShowDialog の戻り値を見て、Form2が自分自身をCloseすればいいのでは?


あ・・・最初のを書きながら思ったんだけど確かめていなかったから…今確かめたら、そうですよね、やっぱり。ダイアログとして表示しているのだから、Form2の方はそこで止まっていますよね。

Form3 frm3 = new Form3();
DialogResult rslt = frm3.ShowDialog(); // ここでfrm3が閉じるのを待つ
if (rslt == ...
{
}
frm3.Dispose(); // 必要
this.Close(); // 自分自身を閉じる


ついでに、Form3では、ボタンのクリックイベントに終了イベントを追加するのではなく、クリックイベントでForm.DialogResultに値を設定します。FormDialogResultに値が設定されると、フォームは閉じます。もしくは、ボタンそのもののButton.DialogResultに値を設定しておきます。クリックすればダイアログは閉じます。
ten
常連さん
会議室デビュー日: 2003/07/07
投稿数: 24
投稿日時: 2003-08-22 09:47
ご返答ありがとうございました。
上手く閉じることができたのですが、孫画面(Form3)が印刷ダイアログであったために、キャンセルを押してもForm2とForm3が閉じてしまっては駄目でした。
すいませんでした。
上手く、OKボタンを押した時のみForm2とForm3が閉じるようにして、キャンセルの時にはForm3のみ閉じるようにすることはできますでしょうか?
※PrintDialogは使用しておりません。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2003-08-22 10:14
だから、『ShowDialog の戻り値を見て』ださい。

Form3の「印刷実行」ボタンのDialogResultにDialogResult.OKを割り当てます。
「キャンセル」ボタンのDialogResultにDialogResult.Cancelを割り当てます。
これで、どちらのボタンもクリックイベントを割り当てなくても、クリックした時点でForm3は閉じます。

Form2がForm3を呼び出しているところで、

Form3 frm3 = new Form3();
frm3.ShowDialog();

としていると思いますが、ここを、
Form3 frm3 = new Form3();
DialogResult result = frm3.ShowDialog();
if (result == DialogResult.OK)
{
this.Close();
}
frm3.Dispose();
とします。(C#って、こんなだっけ?)

 ダイアログの「×」ボタンをクリックしたときに何がくるのかわからないので、これは調べてください。もしくは、無効にしてください。同じく、システムコマンドも戻り値を調べるか、無効にしてください。
1

スキルアップ/キャリアアップ(JOB@IT)