2009-03-27 3 views
0

Вот проблема .... У меня есть три компонента ... Страница, содержащая элемент управления пользователя и серверный элемент управления, который находится в пользовательском элементе управления. Пользовательский элемент управления содержит несколько событий, которые просматривает страница, с помощью которых происходит изменение того, что делает серверный элемент управления.События .NET Control и жизненный цикл страницы

Управление сервером, по существу, создает список просмотра ТВ-гида, заполненный множеством небольших элементов управления ASP.NET, которые должны иметь события. Все эти элементы управления создаются динамически (очевидно, серверная сторона). Для заполнения этого контроля на стороне сервера требуются операции, которые носят интенсивный характер и поэтому должны выполняться только один раз для обратной передачи. Event1 и Event2, и в основном изменит ситуацию с обработкой средств управления серверами (сортировка, фильтрация и т. Д.), Поэтому, когда они срабатывают, мне нужно вызвать PopulateControls.

Вот и проблема: я не могу найти лучшее место для вызова вызова PopulateControls. Если я поместил его в PageLoad, он запускает и рисует список перед любыми событиями. Затем мои события должны сами вызвать PopulateControls для ответа на событие. Если я поставил вызов в PreRender, события на стороне сервера не срабатывают, потому что из того, что я читал, их нужно создать до или во время PageLoad.

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

Вот некоторые псевдо-код

public class MyPage : System.Web.UI.Page 
{ 
    protected UserControl MyUserControl; 

    // Wire up event handlers 
    MyUserControl.Event1 += OnEvent1; 
    MyUserControl.Event2 += OnEvent2; 

    public Page_Load() 
    { 
    } 

    public PreRender() 
    { 
     PopulateControls(); 
    } 

    private PopulateControls() 
    { 
     // Do intensive operation to populate controls 
    } 

    protected OnEvent1() 
    { 
    } 

    protected OnEvent2() 
    { 
    } 
} 

ответ

1

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

Редактировать: Вы должны иметь возможность воссоздать элементы управления и иерархию управления в ответном сообщении. Вы должны отправить достаточную информацию клиенту, чтобы вы могли правильно воссоздать элементы управления на обратной стороне. Это можно сделать, если необходимо сохранить информацию в ViewState.

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

Основной поток должен быть таким. В случае загрузки события, если у вас нет ViewState, необходимого для создания ваших элементов управления, вызовите свой метод заполнения, иначе создайте их из ViewState. Когда происходит обратная связь, событие Load создает их, но их реконструируют из viewstate, поэтому это должно быть дешево. Когда происходит событие post back, вызовите метод заполнения, чтобы воссоздать элементы управления в новом порядке или с новой информацией в зависимости от того, какое событие произошло.

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

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

0

контроля за детьми должны быть созданы в CreateChildControls, который называется в фазе «Init» контрольной жизненного цикла.

+0

Согласовано, но это не решает мою проблему. Если я их создам, мне придется снова их возобновить, когда мое событие срабатывает позже, потому что событие меняет то, что нужно сделать. – cjserio

0

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

Вот приличная статья, которая обсуждает жизненный цикл страницы с пользовательскими элементами управления: http://www.codeasp.net/articles/asp.net/20/aspnet-page-lifecycle

+0

Я не вызываю никаких событий ... События реагируют на то, что сделал пользователь ... Например, OnClicks и т. Д. Они попадают после Page_Load просто по характеру пути работы .NET. – cjserio

+0

Если я правильно понял ваш вопрос, вы хотите, чтобы событие в вашем usercontrol запускалось раньше, чем что-либо еще. Это приведет к событиям в других местах, например, на вашей странице. В этом случае вам нужно поместить свою логику привязки управления в PageInit вашего элемента управления, а не на страницу. – AaronS

+0

Я смущен ... Я не думаю, что порядок событий можно настроить. См. Http://msdn.microsoft.com/en-us/library/ms178472.aspx. Контрольные события всегда появляются после завершения Page_Load. – cjserio

Смежные вопросы