停止从闭的母体形式(Stop a parent form from closing)

2019-11-03 19:36发布

我有一个WinForms应用程序,我需要处理的一个很好的方式..

基本上,我有主申请表,并在那,我有孩子的形式。

用户可以打到父窗体上“关闭”。 但子窗体中,有些事情可能会发生。 举例来说,我可能已经编辑了一些数据绑定领域。

我现在赶子内收盘,并正确保存任何更改。

不过,现在我想取消关闭该选项。 因此,子窗体将提示用户,他们可以真正从关闭取消申请。

我试图e.Cancel子窗体关闭事件中,但这不是working-我假设,因为父仍然关闭...有没有办法从子内取消父窗体的关闭过程... ?

Answer 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;   
}


Answer 2:

下面是一个单独的子窗体一个很简单的例子。 如果用户在窗体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)
    {

    }
}

如果你需要带着孩子形式的可变数量的工作,你必须做到以下几点:

  1. 定义一个基类形成暴露一个bool虚拟只读属性AskBeforeClosing
  2. 从该基类派生的所有子形式和通过使用特定逻辑,以防止意外闭合重写属性
  3. 保留所有的孩子形式在Form1中的列表。
  4. 循环,以便在的FormClosing事件处理程序内部列表中查找,如果至少一种形式有AskBeforeClosing =真。 如果是这样,提示用户


文章来源: Stop a parent form from closing