通过中继器在面板中动态加载控件

本文关键字:动态 加载 控件 中继器 | 更新日期: 2023-09-27 18:17:12

我试图通过我在数据库中所有的web控件循环,并将它们添加到中继器中的占位符,如果它们存在的话。我可以算出来,但我不能算出来的是,我通常加载一个控件到一个占位符,如:

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>

通过中继器在面板中动态加载控件

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

你不能给一个不存在的属性赋值,所以对于任何扩展自定义控件的控件使用基类,而不是webcontrol。

你有你自己的类控件的属性,你需要,可以加载和他们的页面基于名称的方式

我已经没有使用c#的经验了,但是我认为这样可以。