我有一个WinForms应用程序,我需要处理的一个很好的方式..
基本上,我有主申请表,并在那,我有孩子的形式。
用户可以打到父窗体上“关闭”。 但子窗体中,有些事情可能会发生。 举例来说,我可能已经编辑了一些数据绑定领域。
我现在赶子内收盘,并正确保存任何更改。
不过,现在我想取消关闭该选项。 因此,子窗体将提示用户,他们可以真正从关闭取消申请。
我试图e.Cancel子窗体关闭事件中,但这不是working-我假设,因为父仍然关闭...有没有办法从子内取消父窗体的关闭过程... ?
我建议认购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的文本框中输入的东西时,他试图关闭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事件处理程序内部列表中查找,如果至少一种形式有AskBeforeClosing =真。 如果是这样,提示用户