C# Can';t在用户控件的加载方法中将windows窗体转换为myform

C# Can';t在用户控件的加载方法中将windows窗体转换为myform,c#,winforms,C#,Winforms,我正在Windows窗体(f1)中使用用户控件(uc1),以便显示窗体的某些元素 虽然我需要访问表单(f1)的一些元素,但这里有(uc1)。因此,我在负载中有以下行: private void UC1_Load(object Sender, EventArgs e) { F1 parentFrom = (F1)this.parent; } 现在,这在执行时完全可以正常工作,但当我尝试在设计器中打开F1时,我得到了错误(从我的母语翻译): “System.Windows.Forms.Fo

我正在Windows窗体(f1)中使用用户控件(uc1),以便显示窗体的某些元素

虽然我需要访问表单(f1)的一些元素,但这里有(uc1)。因此,我在负载中有以下行:

private void UC1_Load(object Sender, EventArgs e)
{
    F1 parentFrom = (F1)this.parent;
}
现在,这在执行时完全可以正常工作,但当我尝试在设计器中打开F1时,我得到了错误(从我的母语翻译):

“System.Windows.Forms.Form”类型的对象不能被删除 转换为“F1”类型


因此,如果不忽略这个“错误”,我就无法在设计器中打开它。因此,我的问题是,我是否做错了什么,或者我是否可以以某种方式避免此错误?

您可以检查null并仅在它有效时使用它,您可能无论如何都应该这样做:

F1 parentFrom = this.parent as F1;
if(parentForm != null)
{
    // Do something.
}
或者,您可以检查控件是否在设计模式下运行:

if (LicenseManager.UsageMode != LicenseUsageMode.Designtime) 
{
    F1 parentFrom = (F1)this.parent;
}
或者,为什么不将两者混合使用呢



作为旁注,如果只能在一个特定表单上直接使用用户控件,那么它似乎无法满足用户控件的要求。也许您确实有一个有效的用例,或者您应该考虑重构您的方法。例如,如果您希望在更新用户控件时表单上发生某些事情,则可以使用自定义事件,并且表单可以在触发事件时采取适当的操作。

该方法工作正常。(使用第一个变体)。我使用的是一个用户控件,因为我需要在主窗口的同一位置显示4个不同的屏幕(单击特定的按钮)。在这些情况下不是使用usercontrol吗?不确定您的确切意思,但是如果它按照您需要的方式工作,那么就不用担心了。你的代码似乎只在一个窗体上运行,所以看起来有点奇怪。自从我上次使用winforms做了一些事情以来,已经有很长一段时间了,所以可能是我走错了方向(在窗口的同一位置具有不同的元素和功能总是一件非常令人不安的事情)。根据您尝试执行的操作,逻辑在放入父窗体时可能更适合/更清晰