如何从UserControl正确引用父表单

时间:2013-07-24 12:47:50

标签: c# winforms user-controls designer

所有,我有一个UserCostrol我最近不得不改变。这一变化要求我引用Parent表单并使用此表单中的属性。这些引用似乎打破了设计师 - 我收到了错误

  

“无法将'System.Windows.Forms.Form'类型的对象强制转换为'Project.SettingsForm'”

Unable to cast object of type 'System.Windows.Forms.Form' to type 'Project.Form1'中描述。

我添加了一个属性来处理Parent表单的引用,如上面的答案中所述,但现在设计师错误说

  

“无法将类型为'System.Windows.Forms.Panel'的对象强制转换为'Project.SettingsForm'”。

编译器呻吟的第一行在下面的代码中标有'<-- Here'

public partial class UiSettingFascia : UserControl, ISettingsControl
{
    public UiSettingFascia()
    {
        InitializeComponent();
    }

    private void UiSettingFascia_Load(object sender, EventArgs e)
    {
        LoadSettings();
        CheckBoxShowTabs.CheckedChanged += Workbook_StateChanged;
        CheckBoxShowVirticalScroll.CheckedChanged += Workbook_StateChanged;
        CheckBoxShowHorizontolScroll.CheckedChanged += Workbook_StateChanged;
    }

    public void LoadSettings()
    {
        UserSettings userSettings = UserSettings.Instance();
        ...
        MainRibbonForm mainRibbonForm = (ControlParent).MainRibbonForm; // <-- Here.
        ...
    }
}

尝试解决初始问题[“无法将'System.Windows.Forms.Form'类型的对象强制转换为'Project.SettingsForm'”]我创建了以下属性< / p>

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

如何解决此问题[“无法将'System.Windows.Forms.Panel'类型的对象强制转换为'Project.SettingsForm'”],同时保持{的功能{ {1}}?

感谢您的时间。

2 个答案:

答案 0 :(得分:1)

看起来你需要编写一些设计时行为的代码。在设计时,UserControl的父实际上可能是Visual Studio(或其某个组件)。这就是Visual Studio能够为您提供在设计时使用控件的GUI的方式 - 它实际上托管了控件;它实际上正在执行。

您可能需要在属性上设置一个属性,该属性使父窗体在设计时给出一些其他行为。另外,我认为UserControls上有一个名为DesignMode的属性,当控件处于设计模式时也是如此 - 这样,你可以在设计时和运行时给控件不同的行为。 MSDN上有很多关于创建控件和配置设计时与运行时行为的文章。

答案 1 :(得分:1)

添加this extension method

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

然后,在您的LoadSettings方法中:

public void LoadSettings()
{
    if (!DesignTimeHelper.IsInDesignMode)
    {
        var settingsForm = (SettingsForm)this.ParentForm;
    }
}