Проводить события на динамически загружаемых пользовательских элементах управления ASP.NET? - PullRequest
0 голосов
/ 14 марта 2011

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

Насколько я понимаю, мне нужно загрузить элементы управления в методе OnPreInit страницы панели мониторинга, однако я не могу получить ссылку на элемент управления Placeholder в этой точке инициализации (т.е. я получаю исключение NullReferenceException); Попытка динамической загрузки Заполнителя через Page.FindControl, по иронии судьбы, дает мне StackOverflowException.

Я также пытался загрузить элементы управления в PreRender и OnInit, но события в элементах управления не связаны должным образом и не будут запускаться.

Код в основном такой:

    // this does not work; if I try to access the placeholder control itself
    // ("phDashboardControls") I get a NullReferenceException, if I try 
    // Page.FindControl("phDashboardControls") I get a StackOverflowException
    protected override void OnPreInit(EventArgs e)
    {
        base.OnPreInit(e);
        Control ph = Page.FindControl("phDashBoardControls"); // Placeholder
        if (ph != null)
        {
           // GetControlsToLoad just instantiates the controls and returns 
           // an IList<Control>.  Eventually it will have logic to 
           // determine which control needs to be loaded based on user role etc.
           foreach (Control control in GetControlsToLoad())                
           {
               ph.Controls.Add(control);
           }
        }
    }

    // IModularControl is a custom interface defining a single 
    //  Initialize method to set up a control...
    private void Page_Load(object sender, EventArgs e)
    {
        foreach (Control control in this.phDashboardControls.Controls)
        {
            if (control is IModularControl)
                ((IModularControl)control).Initialize(this.CompanyID);
        }
    }

Ответы [ 2 ]

0 голосов
/ 15 марта 2011

Просто к вашему сведению проблема была связана с проверкой; события не запускались должным образом, потому что некоторые из проверочных элементов управления (их было тонна) не были настроены на применение только к этому элементу управления.

0 голосов
/ 14 марта 2011

Я успешно загружал элементы управления динамически в Page_Load раньше.Единственное, что я обнаружил, я должен был быть осторожным, чтобы убедиться, что, если я выполняю обратную передачу, те же элементы управления были загружены в последующую page_load, чтобы гарантировать, что состояние просмотра не было повреждено ... все события и т. Д. Работали как ожидалось.В моем случае поток управления закончился примерно так:

page_load - загрузить управление a

(сделать что-то, что вызовет обратную передачу и событие x)

page_load - makeуверен, что вы загружаете элемент управления a

event_x - очищаете элемент управления a, загружаете элемент управления b

(делаете что-то, что вызывает обратную передачу)

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

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

Если у вас есть страница с PlaceHolder1 и Label1, тоследующий код приводит к тому, что событие нажатия кнопки срабатывает очень хорошо:

    protected void Page_Load(object sender, EventArgs e)
{
    var dynamicButton = new Button() { Text = "Click me" };
    dynamicButton.Click +=new EventHandler(dynamicButton_Click);
    PlaceHolder1.Controls.Add(dynamicButton);
}

void dynamicButton_Click(object sender, EventArgs e)
{
    Label1.Text = "Clicked button";
}

ведет себя так же с пользовательским элементом управления:

WebUserControl ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.ascx.cs"   Inherits="WebUserControl" %>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<asp:Button ID="Button1" runat="server" Text="Click Me" onclick="Button1_Click" />

код WebUserControlпозади:

protected void Button1_Click(object sender, EventArgs e)
{
    Label1.Text = "Clicked Button";
}

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

protected void Page_Load(object sender, EventArgs e)
{
    var dynamicControl = Page.LoadControl("~/WebUserControl.ascx");
    PlaceHolder1.Controls.Add(dynamicControl);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...