簡體   English   中英

從用戶控件繼承以使用其他子控件

[英]Inheriting from a User Control to use a different child Control

我有一個用戶控件GridMasterControl ,它包含(除其他事項外)另一個名為Grid的控件。

現在,我需要從Grid繼承以創建EditableGrid (向網格中添加編輯功能)。

然后,我需要創建一個EditableGridMasterControl ,它與GridMasterControl相同,除了它將使用EditableGrid而不是Grid

我可以想到的兩種方法都存在問題。

1.我可以復制並粘貼GridMasterControl ,只需將Grid更改為EditableGrid即可 壞主意(代碼重復不好)。

2.我可以讓EditableGridMasterControlGridMasterControl繼承,然后將一個虛擬函數CreateGrid添加到GridMasterControl中 EditableGridMasterControl可以實現此功能以創建EditableGrid控件。 這也是一個非常糟糕的主意,因為我需要更改設計器文件才能創建控件。 我需要保持設計器文件清潔。

我怎樣才能最好地實現這一目標?

編輯

只是為了澄清一下,我認為問題的症結在於Visual Studio不允許您修改它創建的設計器文件(或者至少是一個非常不好的主意),並且我希望能夠有條件地創建一個不同的類,具體取決於情況。

您是否可以擁有一個具有ReadOnly屬性的控件EditableGridMasterControl 如果將其設置為true,則禁用編輯。 這僅給您維護一組控件,但是要求該控件比簡單的GridMasterControl更高級。

也許您可以考慮使用合成模式在不同控件之間重用您的通用功能。

如果要使設計器文件保持相同,請嘗試以下操作:不要將實際的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();
    }
}

如果GridMasterControl對任一網格類都做相同的事情,則無需更改任何內容: GridMasterControlGrid成員可以保存EditableGrid

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM