我有一个BaseForm,它指定在BaseForm.InitializeComponent()中初始化的几个受保护的控件。我对这些控件进行了保护,以便在我的DerivedForm中访问下拉列表等的值。使这些控件对DerivedForm可访问,将使设计器将它们包含在DerivedForm.InitializeComponent()中,由DerivedForm.InitializeComponent()重新设置它们,从而取消我在BaseForm构造函数中所做的任何额外工作。
是否有一种方法可以在BaseForm中访问我的DerivedForm控件,而不是第二次初始化它们?
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
}发布于 2017-03-21 22:30:50
我对这些控件进行了保护,以便能够访问下拉列表的值
这是你的问题。
不要让那些控件protected。将它们保留为private到基类。公开地将它们公开给子类:将对公共属性中的控件的访问包装为只允许访问那些需要访问的控件的各个方面。
例如:
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对象而不是表单,并使用组合来构建特定于任务的表单。这完全避免了继承。
发布于 2017-03-21 19:15:15
BaseForm的InitializeSettings实现:
protected virtual void InitializeSettings(Settings settings)
{
//initialization of settings
}派生形式的InitializeSettings实现:
protected override void InitializeSettings(Settings settings)
{
base.InitializeSettings(x);
//reinitialization of settings
}在派生表单的构造函数中调用InitializeSettings()将设置您的设置。
好吧,目标对我来说还不清楚。
如果希望仅初始化1次设置,请不要将它们应用于构造函数中。基本上,您应该使用
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
//initialization of settings
}解决该问题的第二种方法是,在默认情况下创建表单构造函数后,甚至没有参数化构造函数,并调用InitializeSettings外部。
https://stackoverflow.com/questions/42935207
复制相似问题