C#中的ShowDialog调用另一个ShowDialog

5
我不确定这是否允许,但我有一个主表单,调用另一个表单并使用ShowDialog尝试调用另一个相同的表单。
例如:
form1 -> form2.showdialog -> form3.showdialog
我在form3的showdialog处遇到错误。
var ssscu = new SSS.SssTwainSimple.MainForm();
ssscu.ShowDialog();

以下是错误信息:

{"Form showDialog尝试将一个不合格的窗体设置为其所有者。窗体不能拥有自己或其所有者。\r\n参数名称: owner"}

我不确定问题出在哪里,难道我不能从一个对话框窗体中调用showdialog吗?

谢谢, Eroc


添加 MDI 允许父子窗体? - brumScouse
这是因为 ssscu 表单在加载时将自身作为所有者传递给另一个表单... 我移动了传递操作,然后它就正常工作了。感谢帮助! - ErocM
3个回答

5

我不能从一个对话框窗体中调用showdialog吗?

当然可以,这样应该可以工作。

但是我认为你创建一个名为MainForm的对话框窗体很奇怪。

我猜测这可能是由事件中发生的其他事情引起的。MainForm在它的构造函数/加载事件中做了什么?


这是问题所在,程序员在加载过程中调用项目做了某些操作。+1!!谢谢! - ErocM

4

这是一个非常不寻常的异常。当构造函数创建表单时,表单已经有一个所有者。如果您没有使用ShowDialog(owner)重载,则Windows Forms必须自行查找所有者。它找回了完全相同的表单。从技术上讲,这是可能的,但您必须编写一些相当奇怪的代码。为了诊断此问题,请将以下代码添加到表单中:

    protected override void OnHandleCreated(EventArgs e) {
        base.OnHandleCreated(e);
    }

并在它上面设置一个断点。如果我猜得对的话,这将在ShowDialog调用之前中断。查看调用堆栈以查看哪个语句正在创建该窗口。


+1 因为它是真的...被调用的应用程序有问题。名称为 mainform,因为调用它的 WPF 控件位于一个项目中,而被调用的 WinForm 位于另一个项目中,两者都在同一个解决方案中。 :) - ErocM

3
尝试将.ShowDialog();替换为.ShowDialog(this); 编辑:我自己还没有尝试过,但这是我开始寻找的地方。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接