尽管您可以动态加载控件并将它们添加到Page类controls集合中,但在我看来,解决问题的最佳方案是利用某种绑定到模板的控件来控制数据模板。您可以使用要添加到页面中的控件来构建模板,这些控件将根据绑定到的数据进行重复。
Repeater控件的一个简单示例可能如下所示:
<asp:Repeater id="dataRepeater" runat="server">
<ItemTemplate>
<asp:ListBox id="myList" runat="server" />
<asp:TextBox id="myText" runat="server" Text= <%#Eval("MyDataField")%> />
<div> Plain Html </div>
</ItemTemplate>
</asp:Repeater>
您可以使用交替的项目模板。此外,对于分层数据,您可以在Repeater绑定到的Item上进行几次传递。例如,假设我想将ListBox绑定到它自己的集合,我可以绑定Repeater,然后在Items集合上进行另一次传递,使用FindControl方法查找我的ListBox,然后对它自己的DataSource执行操作。
foreach (var item in dataRepeater.Items)
{
var listBox = item.FindControl("myList") as ListBox;
listBox.DataSource = moreData;
listBox.DataTextField = "Text";
listBox.DataValueField = "Value";
listBox.DataBind();
}
Repeater、DataList和其他绑定到模板的控件也支持事件,比如ItemDataBound,您也可以使用它们来操作模板。如果您希望根据数据库中的内容控制每个模板项中的内容,则可以执行诸如切换模板中已有控件的可见性之类的操作,或者插入子控件。
如上所述,您可以使用其他一些模板引擎,但其概念相当相似。这个想法是允许您的模板驱动所呈现的HTML,而不是尝试自己操作和管理控制树。