如何让MDI表单父项上的ShowDialog MDI子项?

如何让MDI表单父项上的ShowDialog MDI子项?

问题描述:

在MDI家长表格(使用this.IsMdiContainer = true),我们不允许用方法ShowDialog()显示任何儿童表格;自动会抛出以下异常:如何让MDI表单父项上的ShowDialog MDI子项?

类型的第一个机会异常“System.InvalidOperationException” 发生在System.Windows.Forms.dll中

附加信息:表格不是一个*窗体不能将 显示为模态对话框。在调用showDialog之前,请从任何父表单 中删除表单。

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

+1

只是不要设置窗体的MdiParent属性和ShowDialog()将工作得很好。 –

我在我的项目中实现的一个简单而干净的解决方案是使用回调函数(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主要形式外。

现在;使用显示解决方案:

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#的动作)时管理用户输入一个输入。

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

+0

伟大的答案,谢谢......我一直在这个问题上工作了3个小时,并得到解决。 –