dポイントプレゼントキャンペーン実施中!

C#のプログラミングにて不正な動きをして困っております。
ご存知の方に教えていただきたく思います。
稚拙な質問かも知れませんがご容赦のほど。

【要求】
画面の×ボタン、もしくは終了ボタンが押された時に
確認メッセージを表示して「いいえ」が押されたらフォームを閉じないようにしたいということです。

【構造・実装】
画面構造は、親画面と子画面があり、子画面はモーダルで表示しています。この子画面にFormClosingのイベントを付加しています。

【現象】
(1)親画面起動→終了ボタン押下→メッセージなしで終了
(2)親画面起動→子画面起動→子画面終了ボタン押下→メッセージ表示
 →親画面終了ボタン押下→メッセージ表示
なぜか、子画面に付加したイベントが親画面にも引き継がれているようです。

理由と対処方法をご存知の方がいらっしゃいましたらご教授願います。

A 回答 (3件)

ごめんなさい m(__)m ANo.2 の内容は誤りです


とんだ勘違いをしていたようです ・・・

AddOwnedFormの引数は『所有される側のフォーム』でした
ですからこの場合 subFrom が引数になればいいのです

ならばどうして最初の ShowDialogを行った際に親フォームを閉じるときにもsubForm_FormClosingが呼ばれたかといいますと

モーダルで表示したオブジェクト変数を Dispose()で明示的に破棄しなかったのが原因です
隠れたオブジェクトが アプリの中に潜在していて アプリが終了する際に subFormが閉じられようとして メッセージボックスが顕在化したのでしょう

subform_FormCloingの引数eのCloseReasonプロパティでどのような要因でフォームが閉じられようとしているのかを判断しましょう

単純にはsubFromのVisibleプロパティのチェックだけでもよさそうですが
    • good
    • 0
この回答へのお礼

>モーダルで表示したオブジェクト変数を Dispose()で明示的に破棄しなかったのが原因です

教えて頂いた原因がすごい納得致しました!!!!
この度は何度もお手を煩わせてしまいまして申し訳ありませんでした。
ありがとうございました。m(_ _)m

お礼日時:2008/09/26 09:59

AddOwnedFormの使い方が間違ってますね



AddOwnedFormの引数は 所有者 であった 所有される側ではありません

今回の場合
this.AddOwnedForm( f );
と記述していますので f(子)に所有されるthis(親) となってしまいます
本来は親が子を所有するといった関係にしないといけません

この回答への補足

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

なにか、記載方法が間違っているということでしょうか。
何度も申し訳ありません。

補足日時:2008/09/25 18:45
    • good
    • 0

どこにどのようなコードを記述したのかを明示しましょう



Closingイベントを処理するのは子画面の方なのでしょうか
子画面側にしかClosingイベントの記述が無いのに親画面側でも確認用のMessageBoxが表示されるということですか
このMessageBoxは子画面クラスに記述されたコードで実行されるのでしょうか

デバッグ時に 呼び出し履歴などは確認なさったのでしょうか

現象の再現する最小限の手順をお示しください

この回答への補足

>どこにどのようなコードを記述したのかを明示しましょう
おっしゃるとおりですね。
親クラスは、
subForm f = new subForm()
this.AddOwnerdForm(f);
f.ShowDialog(this);
で呼び出しています。

子クラスは、
Designer.csの部分にFormClosingを追加しています。

>Closingイベントを処理するのは子画面の方なのでしょうか
そのとおりです。

>子画面側にしかClosingイベントの記述が無いのに親画面側でも確認用のMessageBoxが表示されるということですか
そのとおりです。

>このMessageBoxは子画面クラスに記述されたコードで実行されるのでしょうか
そのとおりです。

質問した後いろいろやってみたのですが、
AddOwnerdForm()をコメントアウトすると問題なく動作致しました。
もともとモーダル表示をするためにいろいろ調べて、やってたのですが
ShowDialog()だけで事足りますね・・・。

ただ、AddOwnerdForm()をすると子画面に追加したイベントが
そのまま親に引き継がれるっていうのはいまいち納得ができません。

補足日時:2008/09/25 17:16
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!