/ /親フォームの終了を停止する-c#、forms、winforms

閉じてから親フォームを停止する - c#、forms、winforms

私にはwinformsアプリケーションがあり、以下を処理するための良い方法が必要です。

基本的に、メインのアプリケーションフォームがあり、その中に子フォームがあります。

ユーザーは親フォームで「閉じる」を押すことができます。 しかし、子フォーム内では、いくつかのことが起こっている可能性があります。たとえば、データバインドされたフィールドを編集した可能性があります。

私は現在、子の中でクローズをキャッチし、変更を正しく保存します。

ただし、今はクローズをキャンセルするオプションが必要です。そのため、子フォームはユーザーにプロンプ​​トを表示し、実際にはアプリケーションの終了をキャンセルできます。

私は試してみました。子フォームを閉じるイベント内でキャンセルしますが、これは機能していません-親がまだ閉じているためだと思います...子の中から親フォームの閉じるプロセスをキャンセルする方法はありますか...?

回答:

回答№1は1

購読することをお勧めします FormClosing メインフォームのイベントと各子フォームの検証状態。フォームのクローズを防止します(必要な場合)。以下のコードはあなたを助け、詳細の公平な考えを与えるかもしれません。

private void Main_FormClosing( object sender, FormClosingEventArgs e )
{
foreach(var f in childforms)
{
if(!f.CanClose())
{
e.Cancel = true;
return;
}
}

e.Cancel = false;
}

回答№2の場合は0

これは、1つの子フォームの非常に単純な例です。ユーザーがForm2のテキストボックスに何かを入力すると、form1を閉じようとしたときにプロンプ​​トが表示されます。

public partial class Form1 : Form
{
Form2 form2;

public Form1()
{
form2 = new Form2();
form2.Show();
InitializeComponent();
}



private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (form2.AskBeforeClosing)
{
e.Cancel = MessageBox.Show("Are you sure?","",MessageBoxButtons.OKCancel)==System.Windows.Forms.DialogResult.Cancel;
}
}
}

public partial class Form2 : Form
{
public bool AskBeforeClosing
{
get {
return textBox1.Text != "";
}
}
public Form2()
{
InitializeComponent();
}

private void Form2_Load(object sender, EventArgs e)
{

}
}

可変数の子フォームを使用する必要がある場合は、次を実行する必要があります。

  1. bool仮想読み取り専用プロパティを公開する基本クラスフォームを定義する AskBeforeClosing
  2. この基本クラスからすべての子フォームを派生し、特定のロジックを使用してプロパティをオーバーライドし、偶発的な終了を防ぎます
  3. form1内のリストにすべての子フォームを保持します。
  4. FormClosingイベントハンドラー内のリストをループして、少なくとも1つのフォームにAskBeforeClosing = trueがあるかどうかを確認します。その場合、ユーザーにプロンプ​​トを表示します