在中继器中以编程方式创建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中进行这项工作的合法方法