首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WinForms继承InitializeComponent

WinForms继承InitializeComponent
EN

Stack Overflow用户
提问于 2017-03-21 18:19:09
回答 2查看 2.2K关注 0票数 2

我有一个BaseForm,它指定在BaseForm.InitializeComponent()中初始化的几个受保护的控件。我对这些控件进行了保护,以便在我的DerivedForm中访问下拉列表等的值。使这些控件对DerivedForm可访问,将使设计器将它们包含在DerivedForm.InitializeComponent()中,由DerivedForm.InitializeComponent()重新设置它们,从而取消我在BaseForm构造函数中所做的任何额外工作。

是否有一种方法可以在BaseForm中访问我的DerivedForm控件,而不是第二次初始化它们?

代码语言:javascript
复制
    public SettingsDialogBase(Settings settings)
    {
        InitializeComponent();

        // Additional work which initializes dropdowns, etc
        InitializeSettings();
    }

    public SettingsDialog(Settings settings) : base(settings)
    {
        InitializeComponent();
        // InitializeSettings() rendered useless on controls that are set to protected
        // because SettingsDialog.InitializeComponent() included them automatically
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-21 22:30:50

我对这些控件进行了保护,以便能够访问下拉列表的值

这是你的问题。

不要让那些控件protected。将它们保留为private到基类。公开地将它们公开给子类:将对公共属性中的控件的访问包装为只允许访问那些需要访问的控件的各个方面。

例如:

代码语言:javascript
复制
class BaseForm : Form
{
    public string PromptText
    {
        get { return textBox1.Text; }
        set { textBox1.Text = value; }
    }

    public int SelectedIndex
    {
        get { return comboBox1.SelectedIndex; }
        set { comboBox1.SelectedIndex = value; }
    }

    // etc.
}

注意,如果像ComboBox这样的东西使用例如枚举值,则可以使用类似于SelectedValue的属性,在从comboBox1.SelectedValue属性返回时具有枚举类型和强制转换。

还请注意,解决这种设计问题的另一种方法是编写UserControl对象而不是表单,并使用组合来构建特定于任务的表单。这完全避免了继承。

票数 1
EN

Stack Overflow用户

发布于 2017-03-21 19:15:15

BaseForm的InitializeSettings实现:

代码语言:javascript
复制
protected virtual void InitializeSettings(Settings settings)
{
    //initialization of settings
}

派生形式的InitializeSettings实现:

代码语言:javascript
复制
protected override void InitializeSettings(Settings settings)
{
    base.InitializeSettings(x);
    //reinitialization of settings
}

在派生表单的构造函数中调用InitializeSettings()将设置您的设置。

好吧,目标对我来说还不清楚。

如果希望仅初始化1次设置,请不要将它们应用于构造函数中。基本上,您应该使用

代码语言:javascript
复制
protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    //initialization of settings
}

解决该问题的第二种方法是,在默认情况下创建表单构造函数后,甚至没有参数化构造函数,并调用InitializeSettings外部。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42935207

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档