通过转发器动态加载控件到面板

时间:2014-08-07 17:38:53

标签: c# asp.net

我正在尝试遍历数据库中的所有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>

1 个答案:

答案 0 :(得分:0)

反射是你的朋友,Activator.CreateInstance将允许你按名称加载一个类型。几年前我在一个定制的CMS中使用了类似的方法。

您无法分配给不存在的属性,因此请为扩展自定义控件而不是webcontrol的任何控件使用基类。

您拥有自己的控件类,其中包含您需要的属性,可以通过这种方式将名称加载到页面中。

我没有使用C#,但我认为这样可行。