你如何在C#.NET中“克隆”WebControls?

时间:2008-10-02 09:17:57

标签: c# .net asp.net

我的基本问题是,在.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 个答案:

答案 0 :(得分:4)

使用Repeater和绑定dud数据源有什么问题。它将复制模板化控件并处理ID创建和所有。

答案 1 :(得分:1)

正如其他人真正想要克隆自定义服务器控件的参考。

public class MyCustomServerCtrl
{

   ...

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

}

但是请注意:这很少需要,如果是这样的话,很可能只是当你有一些非常具体的逻辑时。应尽可能避免。通常,它应该足以使用现有的控件,如Repeater,ListView等。

答案 2 :(得分:0)

在ASP.NET中执行此操作的方法是使用模板。 MSDN中有样本,只需查看模板化控件/ ITemplate。

答案 3 :(得分:0)

WebControl.CopyBaseAttributes方法将AccessKey,Enabled,ToolTip,TabIndex和Attributes属性从指定的Web服务器控件复制到调用此方法的Web服务器控件。

MSDN Documentation