1

私は次のコードを持っています:

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();
        }
    }
}

ダイアログ

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

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

form1を閉じるには、form1の「X」ボタンを2回クリックする必要があります。何が問題になる可能性がありますか?

4

2 に答える 2

1

今は試すことができませんが、Dialog_FormClosingでこのテストを追加できます

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

RemoveOwnedFormのMSDNドキュメントから:

所有者フォームに割り当てられたフォームは、RemoveOwnedFormメソッドが呼び出されるまで所有されたままになります。このメソッドは、所有フォームのリストから所有フォームを削除するだけでなく、所有フォームをnullに設定します。

于 2012-11-15T11:42:54.057 に答える
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)は必要ありません。

于 2012-11-15T13:06:19.347 に答える