Делегаты, элементы управления UpdatePanels и ascx - PullRequest
0 голосов
/ 17 февраля 2011

Я создал элемент управления ascx, который является частью различных компонентов моего приложения.В этом элементе управления есть кнопка «Предыдущая» и «Следующая», которая должна быть передана на родительскую страницу aspx.Это делается с помощью добавления на родительскую страницу некоторых делегатов для обратных передач, таких как OnPreviousClicked, OnNextClicked и т. Д.

Все в этом приложении «ajaxified» с панелью обновления.Теперь я замечаю, что мое приложение разрывается, если я не устанавливаю делегатов при каждом вызове Page_Load в родительском элементе.Другими словами, если я не ВСЕГДА устанавливаю делегаты в Page_Load родительского aspx, тогда ascx заканчивается нулевыми делегатами и исключением.Правильно ли я пишу код?

Ответы [ 4 ]

2 голосов
/ 17 февраля 2011

// внутри элемента управления

public event EventHandler OnPreviousClicked;

private void PreviousButton_OnClick(object sender, EventArgs e)
{
  if(OnPreviousClicked != null) {
    OnPreviousClicked(this, e); // or whatever args you want
  }
}

// и внутри кода страницы

private void Page_Load(...)
{
   MyUserControl.OnPreviousClicked += new EventHandler(myHandler);
}

// ИЛИ внутри страницы aspx, вы также можете просто установить свойство OnPreviousClicked.

<xx:MyUserControl ID="MyUserControl1" runat="server" OnPreviousClicked="myHandler" />

См. http://asp.net -tutorials.com / пользовательские элементы управления / события / .

2 голосов
/ 17 февраля 2011

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

Сначала объявите события в вашем коде ASCX:

public event System.EventHandler NextSelected;

Затем вы создаете события нажатия кнопки, которые вызывают событие.

protected void btnNextSelected_Click(object sender, EventArgs e)
{
   if (EmployeeSelected != null) 
   {
      NextSelected(this, new EventArgs());
   }
}

Затем на своих родительских страницах ASP.Net вы можете добавить свой элемент управления ASCX (назовем его NavControl) и создать методы, которые прослушивают эти события.

NavControl.NextSelected += new EventHandler(NextPageRedirect);

protected void NextPageRedirect(object sender, EventArgs e)
{
    Response.Redirect("~/ViewEmployee.aspx", false);

}

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

1 голос
/ 17 февраля 2011

Это ожидаемое поведение в asp.net.

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

1 голос
/ 17 февраля 2011

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

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