Вопрос по c#, asp.net, page-lifecycle, .net, user-controls – Загрузка вложенных пользовательских элементов управления в ASP.NET

0

У меня проблема с вложенными элементами управления, которые не загружаются должным образом. Я пробовал разные методы страницы, но ничего не помогло.

РЕДАКТИРОВАТЬ: сайт компилируется и работает нормально - он просто оставляет пустой экран, хотя.

По сути, у меня есть элемент управления оберткой для диаграммы, который позволяет мне выбирать данные, связывать и настраивать диаграмму с большой абстракцией. Для этого мне нужен еще один элемент управления оберткой, потому что могут быть группы диаграмм, которые я хочу легко представить.

Обобщенные ответы тоже были бы отличными.

Вот что у меня есть. Я заменил свои пользовательские свойства / атрибуты на наполнители:

Default.aspx:

<%@ Page Language="C#" CodeBehind="Default.aspx.cs" %>
<%@ Register src="OuterUserControl.ascx" tagname="OuterUserControl" tagprefix="uc2" %>
<uc2:OuterUserControl ID="uc1" runat="server" Att1="foo" Att2="bar" />

OuterUserControl.ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="OuterUserControl.ascx.cs" Inherits="Proj.OuterUserControl" EnableViewState="false" %>
<%@ Register src="InnerUserControl.ascx" tagname="InnerUserControl" tagprefix="uc1" %>
<div runat="server" id="holder"></div>

OuterUserControl.ascx.cs:

private member variables
Att1
Att2
protected void Page_Load(object sender, EventArgs e)
{
for(int i=0;i<5;i++)
 {
  InnerUserControl cuc = new InnerUserControl(id);
  holder.Controls.Add(cuc);
 }
}

InnerUserControl.ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="InnerUserControl.ascx.cs" Inherits="Proj.InnerUserControl" %>
<asp:Chart ID="chart" runat="server"></asp:Chart>

InnerUserControl.ascx.cs:

private int id;
//private member variables
public InnerUserControl(int id)
{
this.id = id;
this.chart = new Chart();
}
protected void Page_Load(object sender, EventArgs e)
{
//Get data for given id
//Databind chart
//etc..
}

Ваш Ответ

3   ответа
0

Вы пытались добавить

<%@ Reference Control="InnerUserControl.ascx" %>

в OuterUserControl.ascx

@Slim, спасибо, но у меня есть «ссылки» и «регистры» на всех элементах управления и страницах ... один и тот же результат белой страницы. Chet
Затем попробуйте этот & lt;% @ Reference Control = & quot; InnerUserControl.ascx & quot; % & GT; в OuterUserControl.ascx
Спасибо, да, у меня есть. Chet
Я не думаю, что ты сделал
0

Я рекомендую другой подход. Вместо того, чтобы создавать экземпляр объекта управления в выделенном фрагменте кода и добавлять его в коллекцию элементов управления (что, я думаю, вам, вероятно, понадобится LoadControl () для правильной работы и сделать это раньше, чем page_load, чтобы подключить его к жизненному циклу страницы), добавьте внутреннее управление декларативно в OuterUserControl.

Если вам нужно добавить InnerUserControl 5 раз (как в примере), объявите InnerUseControl внутри ретранслятора. Это связано со списком идентификаторов.

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="OuterUserControl.ascx.cs" Inherits="Proj.OuterUserControl" EnableViewState="false" %>
<%@ Register src="InnerUserControl.ascx" tagname="InnerUserControl" tagprefix="uc1" %>
       <asp:Repeater ID="Repeater1" runat="server" DataSourceID="src">
    <ItemTemplate>
      <uc1:InnerUserControl id="iuc" runat="server" ID='<%#Eval("ID")%>'/>
    </ItemTemplate>
    </asp:Repeater>

    <asp:ObjectDataSource ID="src" runat="server" SelectMethod="IDList" 
        TypeName="Web.Default"></asp:ObjectDataSource>
3

Когда вы добавляете пользовательский элемент управления из кода, вы должны загрузить элемент управления. Вы можете сделать это, выполнив что-то вроде этого:

protected void Page_Load(object sender, EventArgs e)
{
    for(int i=0;i<5;i++)
    {
        InnerUserControl cuc = (InnerUserControl)this.Page.LoadControl("InnerUserControl.ascx");

        holder.Controls.Add(cuc);
    }
 }

Предполагая, что они находятся в одном каталоге. Если нет, укажите виртуальный путь в качестве параметра для метода LoadControl. Вам не нужно иметь оператор регистрации на внешнем элементе управления, когда вы делаете это. Кроме того, я обычно использую в начале кода вместо тега div. Однако я не уверен, что это имеет значение. Я бы также рекомендовал загрузить элемент управления OnInit, так как это обеспечит выполнение всех этапов жизненного цикла для ваших пользовательских элементов управления.

Удачи!

Я не могу получить доступ к своему пользовательскому контролю в методе Page_Load другого пользовательского контроля. Как поместить виртуальный путь в качестве параметра в метод LoadControl?

Похожие вопросы