Динамическое добавление пользовательского элемента управления на страницу оставляет элементы управления внутри UC равными нулю. - PullRequest
0 голосов
/ 16 января 2019

Мне нужно добавить динамический контроль UserControl в Panel на странице. UserControl имеет повторитель с идентификатором ARepeater. Я загружаю и добавляю UC на Page_Init. Я проверяю значение ARepeater в событиях Init, Load и PreRender UC, но ARepeater всегда равен нулю.

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

The 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 голосов
/ 16 января 2019

Прежде всего, вам не нужно быть в 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();
0 голосов
/ 16 января 2019

Вам, вероятно, не понравится этот ответ, но перегрузка для Page.LoadControl, которая позволяет указывать тип элемента управления и добавлять аргументы конструктора, не привязывает ascx к выделенному коду и всем связанным дочерним элементам управления в конечном итоге будет нулевым.

В прошлом я работал над этим, добавляя еще один метод установки зависимостей после создания пользовательского элемента управления, но это не идеальное решение.

Это сказало, что ты не делаешь ничего плохого. Привязка будет работать правильно, если вы используете Page.LoadControl("~/path/to/mycontrol.ascx"), но у вас не будет инжектора конструктора.

Я полагаю проблема заключается в том факте, что базовый класс на самом деле не имеет отношения с интерфейсной страницей, кроме как через директиву page, которая определяет его как класс code-behind. Ничто не останавливает несколько различных внешних интерфейсов, использующих один и тот же класс, как и его код-сзади, поэтому загрузка с помощью Type делает либо очень трудным, либо невозможным определение того, каким будет правильное ascx для связывания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...