我有一个用户控件,GridMasterControl,它包含(除其他外)另一个名为Grid的控件。
现在,我需要从网格继承来创建EditableGrid (向网格添加编辑功能)。
然后,我需要创建一个EditableGridMasterControl,它将与GridMasterControl相同,只是它将使用EditableGrid,而不是网格。
我所能想到的实现这一点的两种方法都有问题。
1. I可以复制和粘贴GridMasterControl,只需将网格更改为EditableGrid即可。坏主意(代码复制不好)。
2. I可以让EditableGridMasterControl从GridMasterControl继承,然后将虚拟函数CreateGrid添加到GridMasterControl中。EditableGridMasterControl可以实现这一点来创建EditableGrid控件。这也是一个非常糟糕的想法,因为我需要更改设计器文件来创建控件。我需要保持设计师档案的干净。
我如何才能最好地实现这一点?
编辑
为了澄清这一点,我认为问题的症结在于,Visual不允许您修改它创建的设计器文件(或者至少是一个非常糟糕的主意),而且我希望能够根据情况有条件地创建不同的类。
发布于 2010-01-05 14:33:30
如果您想让设计器文件保持两者相同,请尝试如下:与其将实际的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();
}
}发布于 2010-01-05 11:54:38
你能不能没有一个控件,EditableGridMasterControl,它有一个ReadOnly属性?如果此设置为true,则禁用编辑。这只为您提供了一组要维护的控件,但要求控件比简单的GridMasterControl更高级。
发布于 2010-01-05 11:51:01
也许您可以考虑使用合成模式在不同控件之间重用您的公共功能。
https://stackoverflow.com/questions/2005777
复制相似问题