2008-10-02 48 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