【问题标题】:C# ShowDialog calling another ShowDialogC# ShowDialog 调用另一个 ShowDialog
【发布时间】:2010-11-02 18:10:03
【问题描述】:

我不确定这是否允许,但我有一个主窗体,它使用 ShowDialog 调用另一个窗体,它试图调用另一个相同的窗体。

所以,例如:

form1 -> form2.showdialog -> form3.showdialog

form3 的显示对话框出现错误:

var ssscu = new SSS.SssTwainSimple.MainForm();
ssscu.ShowDialog();

这是错误:

{"Form showDialog 试图设置一个 不合格的形式作为其所有者。形式 不能拥有自己或他们的 所有者。\r\n参数名称:所有者"}

我不确定我是否理解问题所在,我是否不允许从对话框形式调用 showdialog?

谢谢, 埃罗克

【问题讨论】:

  • 添加 MDI 允许父子窗体?
  • 这是因为 ssscu 表单将自身传递给另一个表单作为负载中的所有者......我移动了通行证并且它起作用了。感谢您的帮助!

标签: c# winforms


【解决方案1】:

我是否不允许从作为对话框的表单中调用 showdialog?

你当然是被允许的,这应该有效。

但我确实认为您创建一个名为 MainForm 的对话框表单很奇怪。

我认为这是由事件中发生的其他事情引起的。 mainForm 在它的构造函数/Load-event 中做了什么?

【讨论】:

  • 这是问题所在,程序员让调用项目在负载中做某事。 +1!!谢谢!
【解决方案2】:

这是一个非常不寻常的例外。构造函数创建表单时,表单已经拥有所有者。您没有使用 ShowDialog(owner) 覆盖,因此 Windows 窗体必须为自己找到所有者。它找到完全相同的形式。这在技术上是可行的,但您必须编写一些相当奇怪的代码。要对此进行诊断,请将此代码添加到表单中:

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

并在其上设置断点。如果我的猜测是正确的,这将在 ShowDialog 调用之前中断。查看调用堆栈以查看创建该窗口的语句。

【讨论】:

  • +1,因为这是真的……被调用的应用程序有问题。该名称是 mainform,因为调用它的 wpf 控件在一个项目中,而被调用的 winform 是另一个项目,两者都在同一个解决方案中。 :)
【解决方案3】:

尝试将.ShowDialog(); 替换为.ShowDialog(this);

编辑:我自己没有试过,但这是我要开始寻找的地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    相关资源
    最近更新 更多