C# 如何从UserControl正确引用父窗体
总之,我有一个C# 如何从UserControl正确引用父窗体,c#,winforms,user-controls,designer,C#,Winforms,User Controls,Designer,总之,我有一个UserCostrol,我最近不得不更改它。此更改要求我引用父级表单并使用此表单中的属性。这些参考资料似乎打破了设计师的形象——我犯了一个错误 “无法将'System.Windows.Forms.Form'类型的对象强制转换为'Project.SettingsForm'类型” 这是在一篇文章中描述的 我已经添加了一个属性来处理对Parent表单的引用,如上面提到的答案中所述,但是现在设计器的错误是 无法将“System.Windows.Forms.Panel”类型的对象强制转换为“
UserCostrol
,我最近不得不更改它。此更改要求我引用父级表单并使用此表单中的属性。这些参考资料似乎打破了设计师的形象——我犯了一个错误
“无法将'System.Windows.Forms.Form'类型的对象强制转换为'Project.SettingsForm'类型”
这是在一篇文章中描述的
我已经添加了一个属性来处理对Parent
表单的引用,如上面提到的答案中所述,但是现在设计器的错误是
无法将“System.Windows.Forms.Panel”类型的对象强制转换为“Project.SettingsForm”类型
编译器抱怨的第一行用标记,看起来您需要在某些设计时行为中编码。在设计期间,UserControl的父级实际上可能是Visual Studio(或其某些组件)。这就是为什么VisualStudio能够为您提供一个GUI,以便在设计期间使用控件—它实际上承载控件;它实际上正在执行
您可能需要在采用父窗体的属性上设置一个属性,以便在设计时为其提供一些其他行为。此外,我认为UserControls上有一个名为DesignMode
的属性,当控件处于设计模式时,该属性将为true。通过这种方式,您可以在设计时和运行时为控件提供不同的行为。MSDN上有很多关于创建控件和配置其设计时与运行时行为的文章。添加:
然后,在您的LoadSettings
方法中:
public void LoadSettings()
{
if (!DesignTimeHelper.IsInDesignMode)
{
var settingsForm = (SettingsForm)this.ParentForm;
}
}
使用事件与父窗体对话。为什么不使用:var settingsForm=(settingsForm)this.ParentForm
?@AlexFilipovici这就是问题所在,在设计时编译用户控件
的初始化过程中,控件不应该知道任何有关父窗体类型的信息。我试图用一个仍然不理想的属性来“抽象它”,很明显…+1。谢谢你的帮助。这看起来很有希望,但在尝试将UserControl
添加到表单时,我仍然会遇到“无法强制转换…”。有关详细信息,请参阅我的编辑。。。
public SettingsForm ControlParent
{
get { return Parent as SettingsForm; }
}
public static class DesignTimeHelper
{
public static bool IsInDesignMode
{
get
{
bool isInDesignMode = (
LicenseManager.UsageMode == LicenseUsageMode.Designtime ||
Debugger.IsAttached == true);
if (!isInDesignMode)
{
using (var process = Process.GetCurrentProcess())
{
return process
.ProcessName.ToLowerInvariant()
.Contains("devenv");
}
}
return isInDesignMode;
}
}
}
public void LoadSettings()
{
if (!DesignTimeHelper.IsInDesignMode)
{
var settingsForm = (SettingsForm)this.ParentForm;
}
}