• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:【C#】 FormClosingのイベントの追加)

【C#】FormClosingのイベントで不具合発生?対処方法を教えてください

このQ&Aのポイント
  • C#のプログラミングで不具合が発生しています。終了ボタンが押された時に確認メッセージを表示し、いいえが押された場合にはフォームを閉じないようにしたいです。
  • 親画面と子画面があり、子画面にFormClosingのイベントを追加しています。しかし、子画面のイベントが親画面にも引き継がれる現象が起きています。
  • この不具合の理由と対処方法をご存知の方がいらっしゃいましたらアドバイスをお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

ごめんなさい m(__)m ANo.2 の内容は誤りです とんだ勘違いをしていたようです ・・・ AddOwnedFormの引数は『所有される側のフォーム』でした ですからこの場合 subFrom が引数になればいいのです ならばどうして最初の ShowDialogを行った際に親フォームを閉じるときにもsubForm_FormClosingが呼ばれたかといいますと モーダルで表示したオブジェクト変数を Dispose()で明示的に破棄しなかったのが原因です 隠れたオブジェクトが アプリの中に潜在していて アプリが終了する際に subFormが閉じられようとして メッセージボックスが顕在化したのでしょう subform_FormCloingの引数eのCloseReasonプロパティでどのような要因でフォームが閉じられようとしているのかを判断しましょう 単純にはsubFromのVisibleプロパティのチェックだけでもよさそうですが

siina-k
質問者

お礼

>モーダルで表示したオブジェクト変数を Dispose()で明示的に破棄しなかったのが原因です 教えて頂いた原因がすごい納得致しました!!!! この度は何度もお手を煩わせてしまいまして申し訳ありませんでした。 ありがとうございました。m(_ _)m

その他の回答 (2)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

AddOwnedFormの使い方が間違ってますね AddOwnedFormの引数は 所有者 であった 所有される側ではありません 今回の場合 this.AddOwnedForm( f ); と記述していますので f(子)に所有されるthis(親) となってしまいます 本来は親が子を所有するといった関係にしないといけません

siina-k
質問者

補足

ということは、 記載を逆にすればいいのかと認識して f.AddOwnedForm(this)と記載してみたんですが、 ArgumentExcepiton「コントロールの循環参照が発生しました。コントロールはそれ自体を所有したり、その親になることはできません。」 が発生してしまいました。 なにか、記載方法が間違っているということでしょうか。 何度も申し訳ありません。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

どこにどのようなコードを記述したのかを明示しましょう Closingイベントを処理するのは子画面の方なのでしょうか 子画面側にしかClosingイベントの記述が無いのに親画面側でも確認用のMessageBoxが表示されるということですか このMessageBoxは子画面クラスに記述されたコードで実行されるのでしょうか デバッグ時に 呼び出し履歴などは確認なさったのでしょうか 現象の再現する最小限の手順をお示しください

siina-k
質問者

補足

>どこにどのようなコードを記述したのかを明示しましょう おっしゃるとおりですね。 親クラスは、 subForm f = new subForm() this.AddOwnerdForm(f); f.ShowDialog(this); で呼び出しています。 子クラスは、 Designer.csの部分にFormClosingを追加しています。 >Closingイベントを処理するのは子画面の方なのでしょうか そのとおりです。 >子画面側にしかClosingイベントの記述が無いのに親画面側でも確認用のMessageBoxが表示されるということですか そのとおりです。 >このMessageBoxは子画面クラスに記述されたコードで実行されるのでしょうか そのとおりです。 質問した後いろいろやってみたのですが、 AddOwnerdForm()をコメントアウトすると問題なく動作致しました。 もともとモーダル表示をするためにいろいろ調べて、やってたのですが ShowDialog()だけで事足りますね・・・。 ただ、AddOwnerdForm()をすると子画面に追加したイベントが そのまま親に引き継がれるっていうのはいまいち納得ができません。