【问题标题】:Creating a UserControl Programmatically within a repeater?在转发器中以编程方式创建用户控件?
【发布时间】:2010-09-06 22:37:30
【问题描述】:

我有一个绑定到某些数据的中继器。

我绑定到 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);
    }
}

问题在于,虽然绑定有效,但用户控件并未呈现到主页。

【问题讨论】:

    标签: asp.net user-controls webforms


    【解决方案1】:

    我认为 @Craig 走在正确的轨道上,具体取决于您要解决的问题的细节。将其添加到中继器并将其删除或设置 Visible="false" 以将其隐藏在需要的地方。动态创建的控件/用户控件会使 Viewstate 变得棘手,因此如果必须动态添加,请在谷歌上搜索或检查 here。引用的文章还显示了另一种动态加载的方法:

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

        您可以考虑反转问题。也就是说,将控件添加到中继器定义中,如果不需要,则将其删除。不知道您的应用程序的详细信息,这可能会浪费大量时间,但最终可能会奏效。

        【讨论】:

        • 同意,这听起来像是一个更好的解决方案。但这与适用于特定情况的情况不同。
        【解决方案4】:

        嗯,想出了一个办法:

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

        拥有这样的文件依赖似乎很愚蠢,但也许这就是必须完成 UserControls 的方式。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-25
          • 2017-12-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-25
          相关资源
          最近更新 更多