如何让MDI Form父母的ShowDialog MDI孩子?

时间:2016-12-09 20:53:56

标签: c# winforms mdi mdichild

在MDI父表单中(使用属性this.IsMdiContainer = true),我们不允许使用方法ShowDialog()显示任何子表单;自动抛出以下异常:

  

类型'System.InvalidOperationException'的第一次机会异常   发生在System.Windows.Forms.dll

中      

附加信息:不是顶级表单的表单不能   显示为模态对话框。从任何父表单中删除表单   在调用showDialog之前。

有没有人找到解决这个问题的方法?

1 个答案:

答案 0 :(得分:1)

我在项目中实现的一个简单而干净的解决方案是使用回调函数(C#中的Action<T>),当用户输入所需的输入时会触发该函数。

使用ShowDialog的示例:

private void cmdGetList_Click(object sender, EventArgs e)
{
    string strInput = "";

    frmInputBox frmDialog = new frmInputBox("User input:");

    if (frmDialog.ShowDialog() == DialogResult.OK)
        strInput = frmDialog.prpResult;
    else
        strInput = null;
}

ShowDialog 输入框位于MDI主窗体之外。

现在;解决方案使用Show:

private void cmdGetList_Click(object sender, EventArgs e)
{
    getInput(this, (string strResult) =>
        {
            MessageBox.Show(strResult);
        });
}

private void getInput(Form frmParent, Action<string> callback)
{
    // CUSTOM INPUT BOX
    frmInputBox frmDialog = new frmInputBox("User input:");

    // EVENT TO DISPOSE THE FORM
    frmDialog.FormClosed += (object closeSender, FormClosedEventArgs closeE) =>
    {
        frmDialog.Dispose();
        frmDialog = null;
    };

    frmDialog.MdiParent = frmParent; // Previosuly I set => frmParent.IsMdiContainer = true;

    // frmDialog.ShowDialog(); <== WILL RAISE AN ERROR
    // INSTEAD OF:
    frmDialog.MdiParent = frmParent;

    frmDialog.FormClosing += (object sender, FormClosingEventArgs e) =>
    {
        if (frmDialog.DialogResult == DialogResult.OK)
            callback(frmDialog.prpResult);
        else
            callback(null);
    };

    frmDialog.Show();
}

输入框(或任何表单将显示在MDI父表单内): ShowExample

诀窍是使用回调函数(C#上的Action)来管理用户输入的时间。

这是更多的代码行,但显示一个干净的项目是没有价值的。 Final result