【问题标题】:Forbidding access to Inherited winform controls禁止访问继承的 winform 控件
【发布时间】:2009-06-04 21:23:21
【问题描述】:

我正在编写一个要继承的 BaseForm。 BaseForm 具有我的应用程序的一些基本标准控件。

问题是: 我希望允许继承的表单使用和更改此控件,但不要将它们从表单中删除。

最大的问题是一个TabControl,其中的Tabs必须由用户继承的Forms添加。 如果我将 BaseForm 上 TabControl 的“修饰符”属性设置为私有,则继承的表单将无法添加新选项卡。 如果我将 BaseForm 上 TabControl 的“修饰符”属性设置为受保护,则继承的 Forms 可以从 BaseForm 中删除 TabControl。

有办法阻止这一切吗?定制设计?

【问题讨论】:

  • 不能在visual studio中创建模板表单吗?

标签: c# winforms inheritance custom-controls


【解决方案1】:

古斯塔沃,

您正站在一系列问题的第一山脚下,迫使开发人员从“基本表单类”继承会遇到这些问题。根据我的经验,以这种方式构建的框架往往非常脆弱,开发人员难以使用。

我想你可以通过将 TabControl 设为私有然后在表单本身上实现一个公共的“Tabs”属性来克服这个特殊的障碍,但我也怀疑你会到达这座山的顶峰并意识到你面前还有许多其他更高的山。我建议您完全重新考虑这种方法。

// set the Modifiers property on tabControl1 to "Private" then implement this
public TabControl.TabPageCollection TabPages
{
    get { return tabControl1.TabPages; }
}

应该使用继承来提供通用功能,而不是提供统一的组合。您确实应该考虑实现“核心屏幕”并设计您的框架以允许开发人员将他们的控件“插入”到该屏幕中。

Composite UI Application Block 是一个很好的起点,尽管可能有一些我不知道的更新。

【讨论】:

  • 感谢 cmets。我的项目是一个基于插件的应用程序。第三方使用将通过附加组件添加功能。我关于继承表格的问题是控制我公司内部的项目。你的想法很好,但我不想尝试 public-properties/private-attributes,因为我希望使用 Visual Design 来构建继承的 Form。
  • 它应该仍然有效。如果控件是私有的,它将在子类表单中显示为锁定。
【解决方案2】:

如果您希望您的表单在 Visual Studio 设计器中表现得“很好”,那么您就不走运了 - 当您直接编辑父表单时,让选项卡控件私有将起作用,但在您尝试时会失败编辑后代。

我相信@Michael Meadows 的回答是正确的——过去我自己构建了复杂的框架,但未能提供我想要的。

从广义上讲,您正在考虑将事物与继承结合在一起,我相信组合会更好地为您服务。至少,这是我的经验。

有关轻量级的想法,请查看 Jeremy Millers 的系列博文Build your own CAB - 很多好材料。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 2013-03-29
    • 2018-10-14
    • 1970-01-01
    • 2021-07-24
    • 2017-09-05
    • 2018-01-07
    相关资源
    最近更新 更多