私には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)
{
}
}
可変数の子フォームを使用する必要がある場合は、次を実行する必要があります。
- bool仮想読み取り専用プロパティを公開する基本クラスフォームを定義する
AskBeforeClosing
- この基本クラスからすべての子フォームを派生し、特定のロジックを使用してプロパティをオーバーライドし、偶発的な終了を防ぎます
- form1内のリストにすべての子フォームを保持します。
- FormClosingイベントハンドラー内のリストをループして、少なくとも1つのフォームにAskBeforeClosing = trueがあるかどうかを確認します。その場合、ユーザーにプロンプトを表示します