如何让MDI表单父项上的ShowDialog MDI子项?
问题描述:
在MDI家长表格(使用this.IsMdiContainer = true
),我们不允许用方法ShowDialog()
显示任何儿童表格;自动会抛出以下异常:如何让MDI表单父项上的ShowDialog MDI子项?
类型的第一个机会异常“System.InvalidOperationException” 发生在System.Windows.Forms.dll中
附加信息:表格不是一个*窗体不能将 显示为模态对话框。在调用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;
}
现在;使用显示解决方案:
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();
}
的技巧是使用一个回调函数(C#的动作)时管理用户输入一个输入。
+0
伟大的答案,谢谢......我一直在这个问题上工作了3个小时,并得到解决。 –
只是不要设置窗体的MdiParent属性和ShowDialog()将工作得很好。 –