2008-10-02 58 views
3

我的基本問題是,如何在.NET中克隆WebControls?如何在C#.NET中克隆WebControls?

我想建立一個自定義標籤,它可以產生多個孩子的副本。最終我打算構建一個類似於JSP/Struts中的標籤。

但是我有的第一個障礙是能夠複製/克隆控件的內容。

考慮這個頗爲人爲的例子;

<custom:duplicate count="2"> 
    <div> 
     <p>Some html</p> 
     <asp:TextBox id="tb1" runat="server" /> 
    </div> 
</custom:duplicate> 

的HTML標記是輸出會是這樣的,

<div> 
    <p>Some html</p> 
    <input type="text" id="tb1" /> 
</div> 
<div> 
    <p>Some html</p> 
    <input type="text" id="tb1" /> 
</div> 

注:我知道我有重複的ID,我可以想出一個解決方案,那以後!

所以我們會有我的自定義控制3個孩子(我認爲) - 一個文字控件,一個TextBox控件和另一個文字控件。

在這個例子中,我已經說'count = 2',所以控件應該做的是輸出/渲染它的子元素兩次。

什麼我希望做的是寫一些「OnInit的」代碼確實是這樣的:

List<WebControl> clones; 
for(int i=1; i<count; i++) 
{ 
    foreach(WebControl c in Controls) 
    { 
     WebControl clone = c.Clone(); 
     clones.Add(clone); 
    } 
} 

Controls.AddRange(clones); 

然而,據我所知,器WebControls沒有實現ICloneable,所以它不可能克隆他們以這種方式。

任何想法如何克隆WebControls?

回答

4

使用Repeater並綁定啞彈數據源有什麼問題。它會複製模板控件並處理ID創建等等。

0

在ASP.NET中執行此操作的方法是使用模板。有MSDN中的示例爲此,只需查找模板控件/ ITemplate。

1

就像其他人真的想克隆自定義服務器控件一樣。

public class MyCustomServerCtrl 
{ 

    ... 

    public MyCustomServerCtrl Clone() 
    { 
     return MemberwiseClone() as MyCustomServerCtrl; 
    } 

} 

但注意:這是非常少需要的,如果是這樣,最有可能只是當你有一些真正的具體邏輯。應儘可能避免。一般來說,它應該足夠使用像Repeater,ListView等現有的控件。

+0

我有一個真正的使用,所以我很高興你發表了這個證明以作記錄。只有7年纔有人找到它! :) – Radderz 2017-01-24 15:13:56

0

WebControl.CopyBaseAttributes方法將AccessKey,Enabled,ToolTip,TabIndex和Attributes屬性從指定的Web服務器控件複製到Web服務器控件這個方法是從中調用的。

MSDN Documentation