0

メインフォームがあり、このフォームのクラスで別のフォームを宣言します。このフォームは、メイン フォームがアンロードされるまで、メイン フォームと共に存続します。メインフォームにボタンがあり、このボタンをクリックするとメンバーフォームが表示されます(前述)。ユーザーがそのフォームを閉じたときにメンバーフォームが閉じないようにしたいので、そのフォームに次の FormClosing イベントハンドラーを追加しました。

private void MemberForm_FormClosing(object sender, FormClosingEventArgs e) {
   if(e.CloseReason == CloseReason.UserClosing){
       e.Cancel = true;
       Hide();
   }
}

それはそのフォームで問題なく機能します。ただし、ユーザーがメインフォームを閉じても、このフォームは閉じられず、どこかに隠されているため、アプリケーションが静かに実行されているように見えます。このフォームも閉じてほしいです。これは、メイン フォームに FormClosed イベント ハンドラーを追加してメンバー フォームを手動で閉じることにより、非常に簡単になります。手動で閉じても問題ありませんが、なぜそうしなければならないのですか? ユーザーがメインフォームを閉じると、メンバーフォームの FormClosing イベントが渡されたパラメーター FormClosingEventArgs で発生し、CloseReason がメインフォーム (UserClosing) の CloseReason と同じになるようです。私はこれを理解していません.フォームのCloseReasonは、ユーザーがXボタンをクリックしたときにのみUserClosingであると思いました.メンバーフォームのCloseReasonは「MainFormClosing」のようなものだと思いました.

デフォルトのように会員フォームを自動的に閉じる方法はありますか?

アップデート

メンバー フォームを表示するメソッド (ダイアログとして表示) は次のとおりです。

private void ShowMemberForm_Click(object sender, EventArgs e){
     memberForm.ShowDialog();
}

しかし、メイン フォームをロードするときに、ShowMemberForm ボタンをクリックする必要がなく、最初にメイン フォームを閉じようとしても、メンバー フォームが閉じないため、これは問題ではないと思います。ありがとう!

アップデート

ここに何か奇妙なことがあります。行e.Cancel = trueをコメントアウトしたり、すべての FormClosing イベントハンドラーをコメントアウトしようとしましたが、問題はまだ残っています。これは非常に奇妙です。以前は問題なく動作していました。メンバー フォームを追加したばかりで、このフォームはスレッド処理に関連していますが、スレッドはメンバー フォームのボタンがクリックされたときにのみ開始されます。私はそのボタンをクリックしませんでした。

4

1 に答える 1

0

私が過去に行ったことは、プログラムで閉じるときにフラグを設定することです

だからメンバーフォームで

private bool _ForceClose = false; 
public void ForceClose()
{
    _ForceClose = true; 
    this.Close(); 
}

private void MemberForm_FormClosing(object sender, FormClosingEventArgs e) 
{
   if(!_ForceClose)
   {
       e.Cancel = true;
       Hide();
   }
}

次に、 MainForm で呼び出すことができます

memberForm.ForceClose(); 

MainForms FormClosing メソッド内から、または MainForms Dispose() または Deconstructor から。それはローテクですが、うまくいきます。MemberForm の Dispose メソッドに _ForceClose = true を配置する必要があるかどうかはわかりませんが、そこに到達すると、すでに閉じられていることは確かですが、実際には害はありませんでした。

于 2013-05-08T20:05:46.503 に答える