- - PR -
複数フォームの閉じ方について
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2003-08-21 14:55
今、C#.NET2002を使用して帳票を作成したのですが、親画面から子画面を表示させることはできたのですが、子画面から子画面と親画面を同時に閉じる方法を教えてください。
例としては、Form1より子画面Form2を開き、Form2よりその子画面Form3を開いた状態です。Form3の終了ボタンを押した際に、Form3及びForm2を同時に閉じたです。 ※Showdialogで表示しております。 宜しくお願いします! | ||||
|
投稿日時: 2003-08-21 15:41
こんにちは。
Form3のプロパティとしてParentFormなどを作り、Form2から開くときに参照設定します。Form3のClosingイベントで、ParentFormがnull(Nothing)でなければ、Closeメソッドを呼び出して閉じます。 #未確認 | ||||
|
投稿日時: 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(); } を行っているのですができません。 宜しくお願いします。 | ||||
|
投稿日時: 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 ] | ||||
|
投稿日時: 2003-08-21 18:10
Form2 の中で Form3 を ShowDialog しているのですよね?
単純に、ShowDialog の戻り値を見て、Form2が自分自身をCloseすればいいのでは? | ||||
|
投稿日時: 2003-08-21 18:53
あ・・・最初のを書きながら思ったんだけど確かめていなかったから…今確かめたら、そうですよね、やっぱり。ダイアログとして表示しているのだから、Form2の方はそこで止まっていますよね。 Form3 frm3 = new Form3(); DialogResult rslt = frm3.ShowDialog(); // ここでfrm3が閉じるのを待つ if (rslt == ... { } frm3.Dispose(); // 必要 this.Close(); // 自分自身を閉じる ついでに、Form3では、ボタンのクリックイベントに終了イベントを追加するのではなく、クリックイベントでForm.DialogResultに値を設定します。FormDialogResultに値が設定されると、フォームは閉じます。もしくは、ボタンそのもののButton.DialogResultに値を設定しておきます。クリックすればダイアログは閉じます。 | ||||
|
投稿日時: 2003-08-22 09:47
ご返答ありがとうございました。
上手く閉じることができたのですが、孫画面(Form3)が印刷ダイアログであったために、キャンセルを押してもForm2とForm3が閉じてしまっては駄目でした。 すいませんでした。 上手く、OKボタンを押した時のみForm2とForm3が閉じるようにして、キャンセルの時にはForm3のみ閉じるようにすることはできますでしょうか? ※PrintDialogは使用しておりません。 | ||||
|
投稿日時: 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
