我正在尝试遍历数据库中的所有webusercontrols,并将它们添加到转发器中的占位符(如果存在)。我可以解决这个问题,但我无法解决的问题是我通常会将控件加载到占位符中,如:
WebHosting ctrlWebhosting = (WebHosting)Page.LoadControl("~/Controls/" + nRow["ClientServiceList"]);
但是,如何从数据库中的项目转换为WebHosting。
我想到了类似下面的内容,但它不起作用:
DataRowView nRow = null;
switch (e.Item.ItemType)
{
case ListItemType.Item:
case ListItemType.AlternatingItem:
nRow = (DataRowView)e.Item.DataItem;
Panel PlaceHolder1 = (Panel)e.Item.FindControl("phService");
nRow["ClientServiceList"] ctrlWebhosting = (nRow["ClientServiceList"])Page.LoadControl("~/Controls/" + nRow["ClientServiceList"]);
ctrlWebhosting.CompanyID = Session["CompanyID"].ToString();
PlaceHolder1.Controls.Add(ctrlWebhosting);
break;
}
转发器的正面是:
<asp:Repeater runat="server" ID="rptServices" OnItemDataBound="rptServices_ItemDataBound">
<itemtemplate>
<asp:PlaceHolder runat="server" ID="phService"></asp:PlaceHolder>
</itemtemplate>
</asp:Repeater>
答案 0 :(得分:0)
反射是你的朋友,Activator.CreateInstance将允许你按名称加载一个类型。几年前我在一个定制的CMS中使用了类似的方法。
您无法分配给不存在的属性,因此请为扩展自定义控件而不是webcontrol的任何控件使用基类。
您拥有自己的控件类,其中包含您需要的属性,可以通过这种方式将名称加载到页面中。
我没有使用C#,但我认为这样可行。