【问题标题】:Stop a parent form from closing阻止父窗体关闭
【发布时间】:2015-05-08 04:01:54
【问题描述】:

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

基本上,我有主申请表,在其中,我有子表。

用户可以在父表单上点击“关闭”。 但是在子窗体中,可能会发生一些事情。例如,我可能编辑了一些数据绑定字段。

我目前捕捉到了孩子内部的关闭,并正确保存了任何更改。

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

我在子表单关闭事件中尝试了 e.Cancel ,但这不起作用-我假设因为父表单仍在关闭...有没有办法从子表单中取消父表单的关闭过程...?

【问题讨论】:

  • 实际上.. 虽然下面的答案很好,但我确实找到了另一种对我有用的方法 - 以防它帮助任何人......在父表单关闭事件中,我不费心检查特殊的“canclose”项目。我只是调用子表单的 Close() 方法(我在孩子的 Closing 事件中有我的检查和平衡。如果需要,它会取消它自己的关闭)然后下一行我检查子表单的 IsDisposed 属性.如果它没有被处理,那么我取消父级的关闭。
  • parent_FormClosing(...) { childform.Close(); if (!childform.IsDisposed) e.Cancel = true; }

标签: c# forms winforms


【解决方案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;   
}

【讨论】:

  • 我可以走这条路.. 谢谢.. 但是我仍然想知道我的问题的答案是否是“不 - 没有办法。期间。”,或者如果不是一件好事,或者如果它太复杂......等等
  • @daBich 每个解决方案都因情况而异,在这种情况下您猜对了,它太复杂且不是优选的解决方案。
【解决方案2】:

这是一个非常简单的单子表单示例。如果用户在 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 事件处理程序中循环列表,以查找是否至少一个表单具有 AskBeforeClosing = true。如果有,提示用户

【讨论】:

  • 谢谢.. 与 Hari 的回答几乎相同(比你快 30 秒!;)).. 但我仍然想知道另一个方向,是否有可能.. 即。取消父级与子级的关闭。这不可能吗?
  • 如果你尝试这样做,你只是混合了责任。子表单有责任告诉父表单它有一些待处理的操作。家长有责任在关闭前发出警报。如果你有更多的孩子,谁来阻止关闭?没有其他方法可以做到这一点。顺便说一句,您应该批准两个答案之一:-)
猜你喜欢
  • 1970-01-01
  • 2011-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多