在转发器中以编程方式创建用户控件?

时间:2008-08-26 22:10:38

标签: asp.net user-controls webforms

我有一个与某些数据绑定的转发器。

我绑定到 ItemDataBound 事件,我正在尝试以编程方式创建 UserControl

简而言之:

void rptrTaskList_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    CCTask task = (CCTask)e.Item.DataItem;

    if (task is ExecTask)
    {
        ExecTaskControl foo = new ExecTaskControl();
        e.Item.Controls.Add(foo);
    }
}

问题在于绑定有效时,用户控件不会呈现给主页面。

有什么想法吗?

4 个答案:

答案 0 :(得分:1)

呃,找到了一种方法:

ExecTaskControl foo = (ExecTaskControl)LoadControl("tasks\\ExecTaskControl.ascx");

像这样的文件加密似乎很愚蠢,但也许这就是UserControls必须如何完成。

答案 1 :(得分:1)

您可以考虑反转问题。即将控件添加到转发器定义中,如果不需要则将其删除。不知道你的应用程序的细节这可能是一个巨大的浪费时间,但它可能最终会成功。

答案 2 :(得分:0)

我认为@Craig在正确的轨道上取决于你正在解决的问题的细节。将其添加到转发器并将其删除或设置Visible =“false”以在需要时隐藏它。使用动态创建的控件/用户控件,Viewstate变得棘手,因此谷歌或者如果必须动态添加,请检查here。引用的文章还显示了一种动态加载的替代方法:

  

控制ctrl = this.LoadControl(Request.ApplicationPath +“/ Controls /”+ ControlName);

答案 3 :(得分:0)

如果您打算从没有页面实例的地方开始,那么您需要更进一步(例如从Web服务返回html或从任务呈现电子邮件)

var myPage = new System.Web.UI.Page();
var myControl = (Controls.MemberRating)myPage.LoadControl("~/Controls/MemberRating.ascx");

我在Scott Guithrie的网站上发现了这种技术,所以我认为这是在.NET中实现它的合法方式