2008-08-26 39 views
0

我有一个绑定到某些数据的中继器。在转发器中以编程方式创建UserControl?

我绑定到的ItemDataBound事件,我试图programmaticly创建用户控件

一言以蔽之:

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); 
    } 
} 

的问题是,虽然绑定工作,用户控件不会呈现给主页面。

任何想法?

回答

1

嗯,想通了如何做这件事的方法:

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

看来愚蠢有一个文件depedancy这样,但也许这就是用户控件必须怎么做。

1

你可以考虑颠倒这个问题。这是将控制权添加到中继器定义,并在不需要时将其删除。不知道你的应用程序的细节这可能是一个巨大的浪费时间,但它可能最终只是工作。

+0

同意的合法的方式,这听起来像一个更好的解决方案。但这与在特定情况下适用的不一样。 – Pete 2009-09-15 10:57:57

0

我认为@Craig是正确的轨道上取决于你正在解决的问题的细节。将其添加到中继器并将其删除或设置Visible =“false”以将其隐藏在需要的位置。 Viewstate对于动态创建的控件/用户控件来说非常棘手,所以谷歌或者如果你必须动态添加,请检查here。还引用的文章示出了替代的方式动态地加载:

控制CTRL = this.LoadControl(Request.ApplicationPath + “/控制/” +控件名称);

0

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

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

我发现斯科特Guithrie的网站这种技术,所以我认为这是应该做它在.NET