- ベストアンサー
【C#】FormClosingのイベントで不具合発生?対処方法を教えてください
- C#のプログラミングで不具合が発生しています。終了ボタンが押された時に確認メッセージを表示し、いいえが押された場合にはフォームを閉じないようにしたいです。
- 親画面と子画面があり、子画面にFormClosingのイベントを追加しています。しかし、子画面のイベントが親画面にも引き継がれる現象が起きています。
- この不具合の理由と対処方法をご存知の方がいらっしゃいましたらアドバイスをお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ごめんなさい m(__)m ANo.2 の内容は誤りです とんだ勘違いをしていたようです ・・・ AddOwnedFormの引数は『所有される側のフォーム』でした ですからこの場合 subFrom が引数になればいいのです ならばどうして最初の ShowDialogを行った際に親フォームを閉じるときにもsubForm_FormClosingが呼ばれたかといいますと モーダルで表示したオブジェクト変数を Dispose()で明示的に破棄しなかったのが原因です 隠れたオブジェクトが アプリの中に潜在していて アプリが終了する際に subFormが閉じられようとして メッセージボックスが顕在化したのでしょう subform_FormCloingの引数eのCloseReasonプロパティでどのような要因でフォームが閉じられようとしているのかを判断しましょう 単純にはsubFromのVisibleプロパティのチェックだけでもよさそうですが
その他の回答 (2)
- redfox63
- ベストアンサー率71% (1325/1856)
AddOwnedFormの使い方が間違ってますね AddOwnedFormの引数は 所有者 であった 所有される側ではありません 今回の場合 this.AddOwnedForm( f ); と記述していますので f(子)に所有されるthis(親) となってしまいます 本来は親が子を所有するといった関係にしないといけません
補足
ということは、 記載を逆にすればいいのかと認識して f.AddOwnedForm(this)と記載してみたんですが、 ArgumentExcepiton「コントロールの循環参照が発生しました。コントロールはそれ自体を所有したり、その親になることはできません。」 が発生してしまいました。 なにか、記載方法が間違っているということでしょうか。 何度も申し訳ありません。
- redfox63
- ベストアンサー率71% (1325/1856)
どこにどのようなコードを記述したのかを明示しましょう Closingイベントを処理するのは子画面の方なのでしょうか 子画面側にしかClosingイベントの記述が無いのに親画面側でも確認用のMessageBoxが表示されるということですか このMessageBoxは子画面クラスに記述されたコードで実行されるのでしょうか デバッグ時に 呼び出し履歴などは確認なさったのでしょうか 現象の再現する最小限の手順をお示しください
補足
>どこにどのようなコードを記述したのかを明示しましょう おっしゃるとおりですね。 親クラスは、 subForm f = new subForm() this.AddOwnerdForm(f); f.ShowDialog(this); で呼び出しています。 子クラスは、 Designer.csの部分にFormClosingを追加しています。 >Closingイベントを処理するのは子画面の方なのでしょうか そのとおりです。 >子画面側にしかClosingイベントの記述が無いのに親画面側でも確認用のMessageBoxが表示されるということですか そのとおりです。 >このMessageBoxは子画面クラスに記述されたコードで実行されるのでしょうか そのとおりです。 質問した後いろいろやってみたのですが、 AddOwnerdForm()をコメントアウトすると問題なく動作致しました。 もともとモーダル表示をするためにいろいろ調べて、やってたのですが ShowDialog()だけで事足りますね・・・。 ただ、AddOwnerdForm()をすると子画面に追加したイベントが そのまま親に引き継がれるっていうのはいまいち納得ができません。
お礼
>モーダルで表示したオブジェクト変数を Dispose()で明示的に破棄しなかったのが原因です 教えて頂いた原因がすごい納得致しました!!!! この度は何度もお手を煩わせてしまいまして申し訳ありませんでした。 ありがとうございました。m(_ _)m