1

我需要将 UserControl dynamicaaly 添加到页面上的面板中。UserControl 有一个Repeater,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>

我做错了什么?

4

2 回答 2

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();
于 2019-01-15T21:34:24.707 回答
0

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

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

那就是说你没有做错任何事。如果您使用 Binding 将正常工作Page.LoadControl("~/path/to/mycontrol.ascx"),但您不会有构造函数注入。

认为问题在于支持类实际上与前端页面没有关系,除非通过将其指定为代码隐藏类的页面指令。没有什么能阻止多个不同的前端使用相同的类作为它的代码隐藏,因此加载通过Type使得很难或完全不可能确定正确ascx的绑定是什么。

于 2019-01-15T21:15:24.853 回答