【问题标题】:Unable to cast object of type 'System.Windows.Forms.Form' to type 'Project.Form1'无法将“System.Windows.Forms.Form”类型的对象转换为“Project.Form1”类型
【发布时间】:2011-04-25 15:55:20
【问题描述】:

我有一个UserControl,它使用了我在表单上可用的一些公共属性,在此UserControlPaint 事件的顶部,我引用了控件的Parent 并强制转换它是我的表单的类型。

var _parent = (Form1)Parent;

此代码有效,但是在设计视图中,抛出了一个错误,我看到的所有 UserControl 都是一个白框,显示这篇文章标题中的错误。 stacktrace 直接指向这行代码。

现在,我已通过我的 UserControl 中的属性重新路由此转换来修复此错误

    public Form1 ControlParent
    {
        get
        {
            if (Parent != null)
            {
                return (Form1)Parent;
            }
            return null;
        }
    }

这对于破坏设计视图的东西来说有点过分......还有其他想法吗?

【问题讨论】:

  • 如果您在设计时不关心控件的显示,只希望错误消失,您可以在用户控件的 Paint 事件中使用“DesignMode”属性。如果(!DesignMode) {... 绘制代码 ...}
  • @Preets 哇,这也很有用。您应该将此作为答案发布,但感谢您输入 =D

标签: c# winforms forms user-controls casting


【解决方案1】:

根据代码,您的孩子Control 实例似乎已经可以处理ControlParentnull。因此,最简单的解决方法是执行以下操作

public Form1 ControlParent
{
    get
    {
        return Parent as Form1;
    }
}

注意:通常,依赖 ParentParent 是特定类型是一个坏主意。它可以防止它被重新托管在其他控件中,并且可以破坏经常捏造类型以提供良好设计体验的设计师。如果您必须依赖像 Parent 这样的特定类型的值,请确保有一个不会在面对不同类型时崩溃的后备计划。

【讨论】:

  • 上面的代码仍然会破坏设计器。这不是运行时问题。出于某种原因,我的 Form1 的设计视图由于那行代码而无法显示 UserControl。就像我在上面所说的,代码运行良好,但设计视图受到影响。
  • @Kyle,如果是这样,那么如果ControlParent 返回null 值,听起来您的子控件无法处理。它必须能够这样做
  • @JaredPar 控件可以处理父级的空值。演员是问题。当设计视图尝试显示控件时,它必须调用 onPaint 事件,这会导致强制转换中断。我不知道为什么,这就是我想要找出的原因。
  • @JaredPar “Parent as Form1”是否与“(Form1)Parent?”不同?如果有,是什么?
  • @Kyle,这是非常不同的。 (Form1)Parent 版本执行动态运行时强制转换。如果Parent 的类型不是Form1,则会抛出异常。在Parent as Form1 版本中,如果Parent 的类型与Form1 不兼容,则只会返回null
【解决方案2】:

您是否检查过第一个代码中的 parent 不为空?

【讨论】:

    【解决方案3】:

    您可以尝试设置表单的所有者,然后通过父属性尝试访问该属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-06
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      相关资源
      最近更新 更多