停止父表单关闭

时间:2015-05-08 04:01:54

标签: c# forms winforms

我有一个winforms应用程序,我需要一个很好的方法来处理以下...

基本上,我有主要的申请表格,在其中,我有儿童表格。

用户可以点击'关闭'在父表格上。 但在儿童形式中,有些事情可能正在发生。例如,我可能已经编辑了一些数据绑定字段。

我目前正在接近孩子,并正确保存任何更改。

但是,现在我想要取消关闭的选项。因此,子表单会提示用户,他们实际上可以取消关闭应用程序。

我在儿童表格结束活动中尝试了e.Cancel,但这不起作用 - 我假设因为父母仍在关闭......有没有办法取消父表格&#39从孩子内部关闭过程......?

2 个答案:

答案 0 :(得分: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;   
}

答案 1 :(得分:0)

这是一个单独子表单的一个非常简单的示例。如果用户在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. 从此基类派生所有子表单,并使用特定逻辑覆盖该属性以防止意外关闭
  4. 将所有子表单保留在form1中的列表中。
  5. 将列表循环到FormClosing事件处理程序中,以便查找至少一个表单是否具有AskBeforeClosing = true。如果是,请提示用户