设置非模态对话框的所有者时无法关闭父窗体

时间:2012-11-15 11:23:18

标签: c# winforms

我有以下代码:

FORM1

public partial class Form1 : Form
{
    Dialog dlg;

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        dlg = new Dialog();
        dlg.Show(this);
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (dlg != null && !dlg.IsDisposed)
        {
            this.RemoveOwnedForm(dlg);
            dlg.Dispose();
        }
    }
}

DIALOG

public partial class Dialog : Form
{
    public Dialog()
    {
        InitializeComponent();
    }

    private void Dialog_FormClosing(object sender, FormClosingEventArgs e)
    {
        e.Cancel = true;
        Hide();
    }
}

我需要在form1的“X”按钮上单击两次才能关闭它。可能有什么问题?

2 个答案:

答案 0 :(得分:1)

我现在无法尝试,但在Dialog_FormClosing中你可以添加这个测试

if(this.Owner != null)
{
    e.Cancel = true;
    Hide();
}

来自RemoveOwnedForm上的MSDN文档:

  

分配给所有者表单的表单在此之前一直保留   调用RemoveOwnedForm方法。除了删除所拥有的   从拥有表单列表中,此方法还设置所有者表单   为空。

答案 1 :(得分:1)

解决方案:

private void Dialog_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason != CloseReason.FormOwnerClosing)
    {
        e.Cancel = true;
        Hide();
    }
}

此解决方案在Form1_FormClosing事件中不需要dlg.Dispose()和this.RemoveOwnedForm(dlg)。