在页面上动态添加用户控件会使UC内的控件为空

时间:2019-01-15 21:07:11

标签: c# asp.net .net aspx-user-control

我需要动态地将UserControl添加到页面上的面板。 UserControl具有ID为ARepeater的中继器。我加载并在Page_Init上添加UC。我在UC的Init,Load和PreRender事件中检查了ARepeater的值,但ARepeater始终为空。

protected Page_Init(object sender, EventArgs e)
{
  var list = (NameList)Page.LoadControl(typeof(NameList), new object[1] { (int)Type });
  Panel1.Controls.Add(list);
}

NameList.ascx

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="NameList.ascx.cs" Inherits="MyCompant.Controls.BannersList" %>
   <asp:Repeater ID="ARepeater" runat="server">
      <ItemTemplate>
      </ItemTemplate>
    </asp:Repeater>

我做错了什么?

2 个答案:

答案 0 :(得分:1)

首先,您无需进入Page_Init即可使用动态控件。 Page_Load很好。但是为了填充中继器,您可以在UserControl中创建一个属性

public partial class WebUserControl1 : System.Web.UI.UserControl
{
    public Repeater _ARepeater
    {
        get
        {
            return ARepeater;
        }
        set
        {
            ARepeater = value;
        }
    }


    protected void Page_Load(object sender, EventArgs e)
    {
    }

然后您可以使用UserControl从页面访问它。

protected void Page_Load(object sender, EventArgs e)
{
    var list = (WebUserControl1)LoadControl("~/WebUserControl1.ascx");
    list.ID = "MyUserControl";
    Panel1.Controls.Add(list);

    list._ARepeater.DataSource = source;
    list._ARepeater.DataBind();
}

或使用FindControl

var _ARepeater = (Repeater)Panel1.FindControl("MyUserControl").FindControl("ARepeater");
_ARepeater.DataSource = dt;
_ARepeater.DataBind();

答案 1 :(得分:0)

您可能不喜欢这个答案,但是Page.LoadControl的重载允许指定控件的类型并添加构造函数参数,不会将ascx绑定到后面的代码,并且所有关联的子控件最终将为null。

过去,我通过构造用户控件后添加另一种设置依赖项的方法来解决此问题,但这不是理想的解决方案。

那表示您没有做错任何事情。如果您使用Page.LoadControl("~/path/to/mycontrol.ascx"),绑定将正常工作,但不会进行构造函数注入。

相信问题在于,后备类实际上与前端页面没有关系,除非通过将其指定为后台代码类的页面指令来实现。没有什么可以使用与代码隐藏相同的类来停止多个不同的前端,因此,Type的加载使确定要绑定的正确ascx变得非常困难或完全不可能。