Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从UserControl正确引用父窗体_C#_Winforms_User Controls_Designer - Fatal编程技术网

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;
    }
}