从用户控件继承以使用其他子控件

时间:2010-01-05 11:47:32

标签: c# user-controls

我有一个用户控件 GridMasterControl ,其中包含另外一个名为 Grid 的控件。

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

然后我需要创建一个 EditableGridMasterControl ,它与 GridMasterControl 相同,只是它将使用 EditableGrid ,而不是 Grid < / em>的

我能想到实现这两点的方法都存在问题。

1。我可以复制并粘贴 GridMasterControl ,只需将网格更改为 EditableGrid 即可。不好的想法(代码重复不好)。

2. 我可以让 EditableGridMasterControl 继承 GridMasterControl ,然后将 CreateGrid 添加到< EM> GridMasterControl EditableGridMasterControl 可以实现此功能来创建 EditableGrid 控件。这也是一个非常糟糕的主意,因为我需要更改设计器文件来创建控件。我需要保持设计器文件的清洁。

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

修改

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

4 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

也许您可以考虑使用composition pattern重复使用不同控件之间的常用功能。

答案 2 :(得分:1)

如果你想保持两者的设计器文件相同,试试这个:不要将实际的Grid控件放到GridMasterControl上,只需将面板作为占位符。

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

这就是我的意思,当然你可以通过几种不同的方式实现相同的模式。您在AbstractGridMasterControl的具体实现之间共享的代码量可能会有所不同,具体取决于控件的相似程度(我不知道)。您可以使用父类 - 而不是接口IGrid - 再次,重要的是您要如何继承。

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();
    }
}

答案 3 :(得分:0)

如果GridMasterControl对任一网格类做同样的事情,则无需更改任何内容:Grid的{​​{1}}成员可以保留GridMasterControl }。