Книга: C# для профессионалов. Том II

Добавление обработчика событий

Добавление обработчика событий

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

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

public event EventHandler Voted;
protected void OnVoted(EventArgs e) {
 Voted(this, e);
}

Тогда, как только нам понадобиться инициировать событие, мы просто вызываем метод OnVoted(), передавая аргументы события.

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

strawPoll1.Voted += new EventHandler(this.StrawPoll1_OnVoted);

Пользователь должен также предоставить код обработчика strawPoll1_OnVoted(). Мы слегка расширим этот метод, добавляя специальные аргументы для события, чтобы сделать доступным элемент управления Option, который инициирует событие. Назовем наш объект специального аргумента OptionEventArgs и определим его в StrawPoll.cs следующим образом:

public class OptionEventArgs : EventArgs {
 public Option originatingOption;
}

Добавляем дополнительное открытое поле в существующий класс EventArgs. Так как мы изменили используемые аргументы, нам потребуется также специализированная версия представителя EventHandler, которая может объявляться в пространстве имен PCSCustomWebControls следующим образом:

public delegate void Option EventHandler(object sender, OptionEventArgs e);

Можно использовать эти примеры в StrawPoll следующим образом:

public class StrawPoll : System.Web.UI.WebControls.WebControl, INamingContainer {
 private string title = "Straw Poll";
 private pollStyle currentPollStyle = pollStyle.voteandvalues;
 public event OptionEventHandler Voted;
 protected void OnVoted(OptionEventArgs e) {
  Voted(this, e);
 }

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

 public void ChildVote(OptionEventArgs e) {
  OnVoted(e);
 }

Наконец, нужно сделать дальнейшую модификацию обработчика события кнопки голосования в Option, чтобы вызывать этот метод, задавая для него правильные параметры:

protected void btnVote_Click(object sender, System.EventArgs e) {
 Increment();
 StrawPoll parent = (StrawPoll)Parent;
 if (parent.PollStyle == pollStyle.voteonly) {
  parent.PollStyle = pollStyle.valuesonly;
 }
 OptionEventArgs eOption = new OptionEventArgs();
 eOption.originatingOption = this;
 parent.ChildVote(eOption);
}

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

<form method= post runat="server">
 <PCS:StrawPoll>

  title="Who is your favorite James Bond?"
  Runat="server" PollStyle="voteonly">
  <PCS:Option Name="Sean Connery" Votes="101" />
  <PCS:Option Name="Roger Moore" Votes="83" />
  <PCS:Option Name="George Lazenby" Votes="32" />
  <PCS:Option Name="Timothy Dalton" Votes="28" />
  <PCS:Option Name="Pierce Brosnan" Votes="95" />
 </PCS:StrawPoll>
 <br> <br>
 <asp:Label Runat= "server" Text="No vote cast." />
</form>

вместе со связанным объявлением в скрытом коде формы, если он не добавляется автоматически:

public class WebForm1 : System.Web.UI. Page {
 protected StrawPoll strawPoll1;

Затем сделаем что-нибудь в самом обработчике событий:

 protected void strawPoll1_OnVoted(object sender, OptionEventArgs e) {
  result.Label.Text = "You voted for " + e.originatingOption.Name + ".";
 }

Теперь, после голосования мы получаем ответную реакцию на наш голос:


Оглавление книги

Оглавление статьи/книги

Генерация: 3.845. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз