Windows アプリケーションの子フォーム内から親フォームを閉じる必要があります。これを行う最良の方法は何ですか?
7 に答える
D2VIANT Answer のイベント ハンドラーの概念を使用しているように見えるこのブログ エントリに出くわしました。
http://www.dotnetcurry.com/ShowArticle.aspx?ID=125
概要: ステップ 1: 新しい Windows アプリケーションを作成します。Visual Studio 2005 または 2008 を開きます。[ファイル] > [新規] > [プロジェクト] に移動し、[プロジェクトの種類] > [Windows アプリケーション] で Visual Basic または Visual C# を選択します。プロジェクトに名前と場所を付けて、[OK] をクリックします。
ステップ 2: 新しいフォームをプロジェクトに追加します。プロジェクトを右クリック > [追加] > [Windows フォーム] > [Form2.cs] > [追加] を選択します。
ステップ 3: Form1 で、ボタン 'btnOpenForm' をドラッグ アンド ドロップし、ダブルクリックしてイベント ハンドラーを生成します。その中に次のコードを書きます。以下に示すように、frm2_FormClosed イベント ハンドラーも追加します。
private void btnOpenForm_Click(object sender, EventArgs e)
{
Form2 frm2 = new Form2();
frm2.FormClosed += new FormClosedEventHandler(frm2_FormClosed);
frm2.Show();
this.Hide();
}
private void frm2_FormClosed(object sender, FormClosedEventArgs e)
{
this.Close();
}
WinForms でフォームを閉じると、すべての子が破棄されます。だから、それは良い考えではありません。たとえば、親フォームにメッセージを送信できます。
私はdavidgに同意します。親フォームへの参照を子フォームのコンストラクターに追加し、必要に応じて親フォームを閉じることができます。
private Form pForm;
public ChildForm(ref Form parentForm)
{
pForm = parentForm;
}
private closeParent()
{
if (this.pForm != null)
this.pForm.Close();
this.pForm = null;
}
Form クラスは「親」フォームへの参照を一切提供しないため、親に直接アクセスする方法はありません (たまたま MDI 親でもある場合を除きます。その場合は、MDIParent プロパティを介してアクセスできます)。 )。子のコンストラクターまたはプロパティで親への参照を渡してから、忘れずに設定し、その参照を使用して親を強制的に閉じる必要があります。
おそらく、親に子のイベントをサブスクライブさせることを検討してください。子は、親を閉じたいときにいつでもそのイベントを起動できます。その後、親は自身のクロージングを (子のクロージングと共に) 処理できます。
フォームを開いたり閉じたりする正しい方法を使用していないことは明らかです。任意の形式の MVC または MVP を使用する場合、この問題は発生しません。
したがって、この問題を解決するには、MVP または MVC の形式を使用してください。
それにはとても簡単な解決策があります。
問題(確かに):アプリ(メインフォーム)を起動する>メインフォームの子フォームをVIAボタンまたは任意のイベントで開く>閉じる(メインフォーム)が、子フォームも閉じます。
解決 :
使用する :
Process.Start("Your_App's_EXE_Full_Path.exe");
例:これを試してフルパスを取得してください:
string FullPath = Environment.CurrentDirectory + "\\YourAppName.exe";
Process.Start(FullPath);
.
this.Close();
- このようにして、開いたままにしたいすべてのフォームを保持することができます。