我有一个与某些数据绑定的转发器。
我绑定到 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);
}
}
问题在于绑定有效时,用户控件不会呈现给主页面。
有什么想法吗?
答案 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中实现它的合法方式