将用户控件动态添加到页面会使 UC 内部的控件为空

我需要将 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>

我做错了什么?


FFIVE
浏览 81回答 2
2回答

至尊宝的传说

首先,您不需要Page_Init使用动态控件。Page_Load很好。但是为了填充中继器,您可以在 UserControl 中创建一个属性public partial class WebUserControl1 : System.Web.UI.UserControl{&nbsp; &nbsp; public Repeater _ARepeater&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; get&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return ARepeater;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; set&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ARepeater = value;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; protected void Page_Load(object sender, EventArgs e)&nbsp; &nbsp; {&nbsp; &nbsp; }然后,您可以使用 UserControl 从页面访问它。protected void Page_Load(object sender, EventArgs e){&nbsp; &nbsp; var list = (WebUserControl1)LoadControl("~/WebUserControl1.ascx");&nbsp; &nbsp; list.ID = "MyUserControl";&nbsp; &nbsp; Panel1.Controls.Add(list);&nbsp; &nbsp; list._ARepeater.DataSource = source;&nbsp; &nbsp; list._ARepeater.DataBind();}或使用 FindControlvar _ARepeater = (Repeater)Panel1.FindControl("MyUserControl").FindControl("ARepeater");_ARepeater.DataSource = dt;_ARepeater.DataBind();

慕勒3428872

您可能不喜欢这个答案,但是Page.LoadControl允许指定控件类型和添加构造函数参数的重载不会将 绑定ascx到代码隐藏,并且所有关联的子控件最终都将为空。过去,我通过在构建用户控件后添加另一种设置依赖项的方法来解决此问题,但这不是一个理想的解决方案。那就是说你没有做错任何事。如果您使用 Binding 将正常工作Page.LoadControl("~/path/to/mycontrol.ascx"),但您不会有构造函数注入。我认为问题在于支持类实际上与前端页面没有关系,除非通过将其指定为代码隐藏类的页面指令。没有什么能阻止多个不同的前端使用相同的类作为它的代码隐藏,因此加载通过Type使得很难或完全不可能确定正确ascx的绑定是什么。
打开App,查看更多内容
随时随地看视频慕课网APP