} else {
iPercentage = 0;
}
writer.Write('<ТD bgcolor='#FFFFDD'><TABLE width='100%'>'
+ '<TR><TD><TABLE border='1' bordercolor= 'black' '
+ ' width= '100%' cellpadding='0' ' + ' cellspacing='0'>');
writer.Write('<TR><TD bgcolor='red' width='' + iPercentage
+ '%'><FONT соlor='red'>.</FONT></TD>');
writer.Write<'TD bgcolor='white' width='' + (100-iPercentage) +
'%'><FONT color='white'>.' +
'</FONT></TD></TR></TABLE></TD>');
writer.Write('<TD width='75'>' + сurrentOption.Votes +
' (' + iPercentage + '%)</TD><TR></TABLE></TD>');
}
// Конец строки
writer.Write('</TR>');
}
// показать общее тело голосов, если выводятся значения
if (currentPollStyle != pollStyle.voteonly) {
writer.Write('<TR><TD bgcolor='#FFFFDD' colspan='' +
iColumns + ''>Total votes cast: ' + iTotalVotes + '</TD></TR>');
}
}
// Завершить таблицу
writer.Write('</TABLE>');
}
Если выборочный опрос выводится в режиме voteonly
, то голосование должно инициировать изменение изображения в режимеvaluesonly
.Option
:
protected void btnVote_Click(object sender, System.EventArgs e) {
Increment();
StrawPoll parent = (StrawPoll)Parent;
if (parent.PollStyle == pollStyle.voteonly) {
parent.PollStyle = pollStyle.valuesonly;
}
}
Теперь все готово к проведению голосования.
Добавление обработчика событий
Часто при использовании специальных элементов управления желательно инициировать специальные события и предоставить пользователям элемента управления действовать в соответствии с этим. В случае элемента управления выборочного опроса было бы хорошо иметь событие 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);