我们如何在C#.NET中"克隆" WebControl?

时间:2020-03-06 15:00:59  来源:igfitidea点击:

我的基本问题是,在.NET中,如何克隆WebControl?

我想构建一个自定义标签,该标签可以产生其子对象的多个副本。
最终,我打算构建一个类似于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吗?

解决方案

在ASP.NET中执行此操作的方法是使用模板。 MSDN中为此提供了一些示例,只需查找模板控件/ ITemplate。

使用Repeater绑定绑定的数据源有什么问题。它将复制模板控件,并处理ID的创建和全部操作。

就像其他确实要克隆自定义服务器控件的参考一样。

public class MyCustomServerCtrl
{

   ...

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

}

但是请注意:这很少需要,如果需要,很可能仅在我们具有某些特定逻辑时才需要。尽可能避免使用。通常,使用现有的控件(如Repeater,ListView等)应该足够了。

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

MSDN文档