【发布时间】:2017-08-13 14:19:24
【问题描述】:
我有一个 BaseForm,它指定了几个在 BaseForm.InitializeComponent() 中初始化的受保护控件。我已经对这些控件进行了保护,以便我可以在我的 DerivedForm 中访问下拉列表等的值。使 DerivedForm 可以访问这些控件会导致设计器将它们包含在 DerivedForm.InitializeComponent() 中,这会重置它们,从而撤消我在 BaseForm 构造函数中所做的任何额外工作。
有没有办法在 DerivedForm 中访问我的 BaseForm 控件,但不能再次初始化它们?
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
}
【问题讨论】:
-
嗯,我不这么认为。我的 BaseForm 和 DerivedForm 都成功调用了它们自己的 InitializeComponent() 方法。问题是 BaseForm 构造函数在 InitializeComponent() 之后对控件进行了额外的工作,并且由于它们是受保护的控件,因此 DerivedForm 在调用自己的 InitializeComponent() 方法时会撤消所有工作。
-
从派生类的构造函数中移除
InitializeComponent() -
我的 DerivedForm 具有特定于它的组件需要初始化....
-
初始化组件并不是一个神奇的方法。它通常在表单设计器文件中生成,但您不需要拥有设计器文件。如果您愿意,可以将它们全部内联到主 .cs 文件中。如果您必须按照自己的方式做事,为什么不编写两个版本的 InitializeComponent 并让每个类调用自己的版本?
标签: c# .net winforms visual-studio inheritance