首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不调用MDI子窗体的FormClosing事件

不调用MDI子窗体的FormClosing事件
EN

Stack Overflow用户
提问于 2012-01-09 16:58:57
回答 4查看 4.5K关注 0票数 5

当我打开一个新的公式时,我正试图关闭一个公式。在结束公式时,我想在结束事件中处理一些特殊的逻辑。但是关闭事件从未被调用,无论是在FormClosing中,还是在关闭事件中,或者在抽象基类中,或者在给定的手动附加事件form_FormClosing中。

当我手动通过单击x关闭表单时,所有事件都会很好地触发。调用Close()方法失败。

你有什么建议来解决我的问题吗?

MdiParent:

代码语言:javascript
复制
private Form _currentForm;
private void ShowForm<T>() where T : Form
{
    if (_currentForm != null && !_currentForm.IsDisposed)
    {
        _currentForm.Hide();
        _currentForm.Close();
    }

    var form = MdiChildren.FirstOrDefault(f => f.GetType() == typeof(T));
    if (form == null)
    {
        form = _formFactory.CreateForm<T>();
        form.MdiParent = this;
        form.WindowState = FormWindowState.Maximized;
        form.FormClosing += form_FormClosing;
        _currentForm = form;
        MdiBackground.Hide();
        form.Show();
    }
    else
    {
        ActivateMdiChild(form);
        form.Activate();
    }
}

void form_FormClosing(object sender, FormClosingEventArgs e)
{
    // will not be called
}

抽象通用mdi子表单:

代码语言:javascript
复制
public abstract partial class BaseForm<TEntity> : Form where TEntity : class, IEntity
{
    protected override void OnClosing(CancelEventArgs e)
    {
        // wil not be called
        if (EditMode == EditModes.Editable)
        {
            MessageBox.Show(this, "Please commit or abort your changes");
            e.Cancel = true;
        }
        base.OnClosing(e);
    }
 }
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-01-09 17:48:21

此错误行为是因为本机windows MDI实现不支持隐藏MDI子窗口。Winforms使用一个技巧来仍然支持隐藏(),它实际上破坏了本机窗口,并在再次调用Show()时重新创建它。但是,这样做有一个副作用,即Close()调用不再引发FormClosing/Close事件,因为本机窗口已经被隐藏()调用破坏了。这是一个bug,在Winforms中并不少见。

解决方法很简单,调用Close()时不需要隐藏(),只需删除它即可。

票数 7
EN

Stack Overflow用户

发布于 2012-01-09 17:10:19

我一直在战斗,找到了解决办法

代码语言:javascript
复制
if (_currentForm != null && !_currentForm.IsDisposed)
{
    // This call prevents calling the closing event -> _currentForm.Hide();
    _currentForm.Close();
}

这是Windows ._。

票数 1
EN

Stack Overflow用户

发布于 2012-01-09 17:04:18

你可以试试这个:

代码语言:javascript
复制
form1.Closing += delegate 
{
  // your logic
};
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8792164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档