首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从用户控件继承以使用不同的子控件

从用户控件继承以使用不同的子控件
EN

Stack Overflow用户
提问于 2010-01-05 11:47:32
回答 4查看 2.3K关注 0票数 3

我有一个用户控件,GridMasterControl,它包含(除其他外)另一个名为Grid的控件。

现在,我需要从网格继承来创建EditableGrid (向网格添加编辑功能)。

然后,我需要创建一个EditableGridMasterControl,它将与GridMasterControl相同,只是它将使用EditableGrid,而不是网格。

我所能想到的实现这一点的两种方法都有问题。

1. I可以复制和粘贴GridMasterControl,只需将网格更改为EditableGrid即可。坏主意(代码复制不好)。

2. I可以让EditableGridMasterControl从GridMasterControl继承,然后将虚拟函数CreateGrid添加到GridMasterControl中。EditableGridMasterControl可以实现这一点来创建EditableGrid控件。这也是一个非常糟糕的想法,因为我需要更改设计器文件来创建控件。我需要保持设计师档案的干净。

我如何才能最好地实现这一点?

编辑

为了澄清这一点,我认为问题的症结在于,Visual不允许您修改它创建的设计器文件(或者至少是一个非常糟糕的主意),而且我希望能够根据情况有条件地创建不同的类。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-01-05 14:33:30

如果您想让设计器文件保持两者相同,请尝试如下:与其将实际的Grid控件删除到您的GridMasterControl上,不如将一个面板作为一个位置保持器。

然后创建一个强制初始化步骤,其中创建适当的网格对象(使用像IGrid这样的接口)。这可以在派生类中完成。

这就是我的意思,当然,您可以用几种不同的方式实现相同的模式。您在AbstractGridMasterControl的具体实现之间共享的代码数量可能有所不同,这取决于控件有多相似(我不知道这一点)。与接口IGrid不同,您可以使用父类--同样,这关系到您想要如何进行继承。

代码语言:javascript
复制
interface IGrid {...}
class Grid : IGrid { ...}
class EditableGrid : IGrid { ... }

abstract class AbstractGridMasterControl
{
    protected IGrid Grid
    {
        set { this.panelControl.Controls.Add(value as Control);}
    }
}

class GridMasterConrol : AbstractGridMasterControl
{
    public GridMasterControl()
    {
        this.Grid = new Grid();
    }
}

class EditableGridMasterConrol : AbstractGridMasterControl
{
    public GridMasterControl()
    {
        this.Grid = new EditableGrid();
    }
}
票数 1
EN

Stack Overflow用户

发布于 2010-01-05 11:54:38

你能不能没有一个控件,EditableGridMasterControl,它有一个ReadOnly属性?如果此设置为true,则禁用编辑。这只为您提供了一组要维护的控件,但要求控件比简单的GridMasterControl更高级。

票数 4
EN

Stack Overflow用户

发布于 2010-01-05 11:51:01

也许您可以考虑使用合成模式在不同控件之间重用您的公共功能。

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

https://stackoverflow.com/questions/2005777

复制
相关文章

相似问题

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