在中继器中以编程方式创建UserControl?
时间:2020-03-05 18:43:33 来源:igfitidea点击:
我有绑定到某些数据的转发器。
我绑定到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); } }
问题在于,尽管绑定有效,但用户控件未呈现到主页上。
有任何想法吗?
解决方案
回答
嗯,想出了一种方法:
ExecTaskControl foo = (ExecTaskControl)LoadControl("tasks\ExecTaskControl.ascx");
像这样的文件欺骗似乎很愚蠢,但是也许这就是必须完成UserControls的方式。
回答
我们可以考虑解决问题。这就是将控件添加到转发器定义中,如果不需要,则将其删除。不知道应用程序的详细信息,这可能会浪费大量时间,但最终可能会解决。
回答
我认为@Craig走在正确的轨道上,具体取决于我们要解决的问题的详细信息。将其添加到转发器并将其删除,或者将Visible =" false"设置为在需要的地方隐藏它。通过动态创建的控件/用户控件,Viewstate变得棘手,因此请在google上查看,或者在此处检查是否必须动态添加。所引用的文章还显示了另一种动态加载方式:
Control ctrl=this.LoadControl(Request.ApplicationPath +"/Controls/" +ControlName);
回答
如果我们要从没有页面实例的地方进行操作,则需要再走一步(例如,从Web服务返回HTML或者从任务呈现电子邮件中获取信息)
var myPage = new System.Web.UI.Page(); var myControl = (Controls.MemberRating)myPage.LoadControl("~/Controls/MemberRating.ascx");
我在Scott Guithrie的网站上发现了这项技术,因此我认为这是在.NET中进行这项工作的合法方法