我有一个用户控件 GridMasterControl ,其中包含另外一个名为 Grid 的控件。
现在我需要继承 Grid 来创建 EditableGrid (为网格添加编辑功能)。
然后我需要创建一个 EditableGridMasterControl ,它与 GridMasterControl 相同,只是它将使用 EditableGrid ,而不是 Grid < / em>的
我能想到实现这两点的方法都存在问题。
1。我可以复制并粘贴 GridMasterControl ,只需将网格更改为 EditableGrid 即可。不好的想法(代码重复不好)。
2. 我可以让 EditableGridMasterControl 继承 GridMasterControl ,然后将 CreateGrid 添加到< EM> GridMasterControl 。 EditableGridMasterControl 可以实现此功能来创建 EditableGrid 控件。这也是一个非常糟糕的主意,因为我需要更改设计器文件来创建控件。我需要保持设计器文件的清洁。
我如何才能最好地实现这一目标?
修改
只是为了澄清我认为问题的症结在于Visual Studio不允许你修改它创建的设计器文件(或者至少它是一个非常糟糕的主意)并且我希望能够有条件地创建一个不同的类视情况而定。
答案 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
}。