Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«C# для профСссионалов. Π’ΠΎΠΌ IIΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 51

Автор Π‘ΠΈΠΌΠΎΠ½ Робинсон

Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ‚Π½ΠΎΠ³ΠΎ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ элСмСнта управлСния

Π’ качСствС нСслоТного ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ‚Π½ΠΎΠ³ΠΎ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ элСмСнта управлСния ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΠΈΡ‚ΡŒ элСмСнт управлСния ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π° с ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ Ρ†ΠΈΠΊΠ»Π°, которая имСлась Π½Π° тСстовой Ρ„ΠΎΡ€ΠΌΠ΅.

НазовСм этот ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ‚Π½Ρ‹ΠΉ элСмСнт управлСния RainbowControl2 ΠΈ помСстим Π΅Π³ΠΎ Π² Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» RainbowControl2.cs. Π­Ρ‚ΠΎΡ‚ элСмСнт управлСния Π΄ΠΎΠ»ΠΆΠ΅Π½ Π΄Π΅Π»Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

β–‘ ΠΠ°ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ· WebControl (Π° Π½Π΅ ΠΎΡ‚ Label Π² этот Ρ€Π°Π·)

β–‘ ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ INamingContainer

β–‘ Π˜ΠΌΠ΅Ρ‚ΡŒ Π΄Π²Π° поля для хранСния своих элСмСнтов управлСния-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠ²

public class RainbowLabel2 : System.Web.UI.WebControls.WebControl, INamingContainer {

 private RainbowLabel rainbowLabel = new RainbowLabel();

 private Button cycleButton = new Button();

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ‚Π½Ρ‹ΠΉ элСмСнт управлСния, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всякий элСмСнт управлСния-ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ добавлялся ΠΊ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ Controls ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ инициализировался. ΠœΡ‹ Π΄Π΅Π»Π°Π΅ΠΌ это, пСрСопрСдСляя ΠΌΠ΅Ρ‚ΠΎΠ΄ CreateChildControls() ΠΈ помСщая Ρ‚ΡƒΠ΄Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ ΠΊΠΎΠ΄:

protected override void CreateChildControls() {

 cycleButton.Text = "Cycle colors.";

 cycleButton.Click += new System.EventHandler(cycleButton_Click);

 Controls.Add(cycleButton);

 Controls.Add(rainbowLabel);

}

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ Add() ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ Controls, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π° Π±Ρ‹Π»Π° ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ. ДобавляСм Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ событий для ΠΊΠ½ΠΎΠΏΠΊΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ цикличСски ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ†Π²Π΅Ρ‚Π°, это достигаСтся Ρ‚ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈ для Π΄Ρ€ΡƒΠ³ΠΈΡ… событий. ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ событий ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌ:

protected void cycleButton_Click(object sender, System.EventArgs e) {

 rainbowLabel.cycle();

}

Π”Π°Π½Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² заставляСт Ρ†Π²Π΅Ρ‚Π° ΠΌΠ΅Ρ‚ΠΊΠΈ цикличСски ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ‚Π½ΠΎΠ³ΠΎ элСмСнта управлСния доступ ΠΊ тСксту Π² ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ΅ rainbowLabel, ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ свойство, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ отобраТаСтся Π² свойство Text ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°:

public string Text {

 get {

  return rainbowLabel.Text;

 }

 set {

  rainbowLabel.Text = value;

 }

}

ΠžΡΡ‚Π°Π»ΠΎΡΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Render(). По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ссли Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ этот ΠΌΠ΅Ρ‚ΠΎΠ΄, вызываСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ Render() ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ элСмСнта управлСния ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°. Однако, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ этим, ΠΌΠΎΠΆΠ½ΠΎ самим Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ эти ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΠΈΠ»ΠΈ, Π»ΡƒΡ‡ΡˆΠ΅, ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ экзСмпляры ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² RenderControl():

protected override void Render(HtmlTextWriter writer) {

 rainbowLabel.RenderControl(writer);

 cycleButton.RenderControl(writer);

}

Π—Π΄Π΅ΡΡŒ Π½Π΅ выводится Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ HTML, хотя ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π»Π΅Π³ΠΊΠΎ это ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. Нам Π½ΡƒΠΆΠ½ΠΎ просто ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ экзСмпляр HtmlTextWriter Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ RenderControl() для ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π±Ρ‹Π» вставлСн HTML, созданный этим ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠΌ. МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ элСмСнт управлСния ΠΏΠΎΡ‡Ρ‚ΠΈ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ RainbowLabel:

<form method="post" runat="server" ID="Form1">

 <PCS:RainbowLabel2 Runat="server"

  Text="Multicolored label composite" ID="rainbowLabel2" />

</form>

вмСстС со связанным объявлСниСм Π² скрытом ΠΊΠΎΠ΄Π΅ Ρ„ΠΎΡ€ΠΌΡ‹.

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ управлСния Π²Ρ‹Π±ΠΎΡ€ΠΎΡ‡Π½Ρ‹ΠΌ опросом

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΎΠΉ ΠΈ создадим Π±ΠΎΠ»Π΅Π΅ слоТный ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ элСмСнт управлСния. ΠšΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π° ASP.NET:

<form method="post" runat="server" ID="Form1">

 <PCS: StrawPoll Runat="server" ID="strawPoll1"

  PollStyle="voteonly" Title="Who is your favorite James Bond?">

  <PCS:Option Name="SeanConnery" 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>

</form>

ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ:

И ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ Π½Π°ΠΆΠΌΠ΅ΠΌ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΡƒ vote, ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ измСнится Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎ, Π² основном для Ρ†Π΅Π»Π΅ΠΉ тСстирования, ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ голосования ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π°Π²Π°Ρ‚ΡŒ нСсколько голосов.

Код ASP.NET Π²ΠΎΠ²Π»Π΅Ρ‡Π΅Π½ явно Π² Π·Π°Π΄Π°Π½ΠΈΠ΅ свойства Name ΠΈ Votes для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Option. Π­Ρ‚ΠΎ прСкрасно ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°, хотя ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅ развитая вСрсия этого элСмСнта управлСния соСдинится с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ для получСния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ². Однако здСсь это Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ достаточно слоТным.

ΠŸΡ€ΠΈ Π°Π½Π°Π»ΠΈΠ·Π΅ ΠΊΠΎΠ΄Π° ASP.NET Ρ‚Π°ΠΊΠΈΠ΅ структуры ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΡŽΡ‚ΡΡ согласованным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ элСмСнт-ΠΏΠΎΡ‚ΠΎΠΌΠΎΠΊ интСрпрСтируСтся способом, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² классС-построитСлС элСмСнта управлСния, связанным с элСмСнтом управлСния ΠΏΡ€Π΅Π΄ΠΊΠΎΠΌ. Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒ элСмСнта управлСния, ΠΊΠΎΠ΄ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΡ‹ скоро ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ всС Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ Π²Π½ΡƒΡ‚Ρ€ΡŒ элСмСнта управлСния, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΎΠ½ связан, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΡŒΠ½Ρ‹ΠΉ тСкст.

Нам Π½ΡƒΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Π²Π° элСмСнта управлСния: Option β€” для хранСния ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Π²Ρ‹Π±ΠΎΡ€Π° ΠΈ StrawPoll, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ элСмСнт управлСния Π²Ρ‹Π±ΠΎΡ€ΠΎΡ‡Π½ΠΎΠ³ΠΎ опроса. Оба эти элСмСнта управлСния Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» исходного ΠΊΠΎΠ΄Π°: StrawPoll.cs.

Π­Π»Π΅ΠΌΠ΅Π½Ρ‚ управлСния Option

Для Π½Π°Ρ‡Π°Π»Π° создадим элСмСнты управлСния Option, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ имя Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π²Ρ‹Π±ΠΎΡ€Π° ΠΈ количСство голосов, ΠΏΠΎΠ΄Π°Π½Π½Ρ‹Ρ… Π·Π° этот Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Π²Ρ‹Π±ΠΎΡ€Π°. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, эти элСмСнты управлСния Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ½ΠΎΠΏΠΊΠΈ голосования ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ всС сдСланныС наТатия этих ΠΊΠ½ΠΎΠΏΠΎΠΊ.

ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π°ΠΌ потрСбуСтся:

β–‘ Код для свойств Name ΠΈ Votes (Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… Π² ViewState)

β–‘ Код ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² CreateChildControls()

β–‘ Код для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° наТатия ΠΊΠ½ΠΎΠΏΠΊΠΈ

ΠœΡ‹ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Increment(), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ голос ΠΊ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌΡƒ счСту. Π­Ρ‚ΠΎΡ‚ Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ вызываСтся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠΌ наТатия ΠΊΠ½ΠΎΠΏΠΊΠΈ.

Нам понадобится Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° INamingContainer, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ нСсколько экзСмпляров этих элСмСнтов управлСния со своими собствСнными ΠΏΠΎΡ‚ΠΎΠΌΠΊΠ°ΠΌΠΈ.

Код класса Option Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² Ρ„Π°ΠΉΠ»Π΅ StrawPoll.cs, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ вмСстС со стандартными инструкциями namespace ΠΈ using, согласно ΡƒΠΆΠ΅ извСстным Π½Π°ΠΌ элСмСнтам управлСния RainbowLabel. Код Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄:

public class Option : System.Web.UI.WebControls.WebControl, INamingContainer {

 public string Name {

  get {

   return (string)ViewState["_name"];

  }

  set {

   ViewState["_name"] = value;

  }

 }


 public long Votes {

  get {

   return (long)ViewState["_votes"];

  }

  set {

   ViewState["_votes"] = value;

  }

 }


 public void Increment() {

  ViewState["_votes"] =(long)ViewState["_votes"] + 1;

 }


 public void Reset() {

  ViewState["_votes"] = 0;

 }


 protected override void CreateChildControls() {

  Button btnVote = new Button();

  btnVote.Text = "Vote";

  btnVote.Click += new System.EventHandler(btnVote_Click);

  Controls.Add(btnVote);

 }


 protected void btnVote_Click(object sender, System.EventArgs e) {

  Increment();

 }

}

ΠžΡ‚ΠΌΠ΅Ρ‚ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄ Render() Π½Π΅ Π±Ρ‹Π» здСсь ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½. Π­Ρ‚ΠΎ связано с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ этот элСмСнт управлСния ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ наслСдника, ΠΊΠ½ΠΎΠΏΠΊΡƒ голосования ΠΈ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ для Π²Ρ‹Π²ΠΎΠ΄Π°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ просто ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΊΠ½ΠΎΠΏΠΊΠΈ.

ΠŸΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒ элСмСнта управлСния StrawPoll

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ рассмотрим, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ ASP.NET ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π²Ρ‹Π±ΠΎΡ€Π° Π² элСмСнт управлСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΎΠΌ элСмСнта управлСния StrawPoll. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π°ΡΡΠΎΡ†ΠΈΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒ элСмСнта управлСния с классом StrawPoll с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° ControlBuilderAttribute. Нам Π½ΡƒΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ элСмСнты управлСния-ΠΏΠΎΡ‚ΠΎΠΌΠΊΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π½ΠΈΠΊΠ°ΠΊΠΈΠΌ Π΄Ρ€ΡƒΠ³ΠΈΠΌ способом с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π° ParseChildren:

[ControlBuilderAttribute(typeof(StrawPollControlBuilder)) ]

[ ParseChildren(false) ]

public class StrawPoll : System.Web.UI.WebControls.WebControl, INamingContainer { }

Π—Π΄Π΅ΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ класс с ΠΈΠΌΠ΅Π½Π΅ΠΌ StrawPollControlBuilder, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

internal class StrawPollControlBuilder : ControlBuilder {

 public override Type GetChildControlType(string tagName, IDictionary attribs) {

  if (tagName.ToLower().EndsWith("option")) return typeof(Option);

  return null;

 }


 public override void AppendLiteralString(string s) {

  // Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ добавлСния встроСнного тСкста

  // ΠΊ элСмСнту управлСния

 }

}

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ пСрСопрСдСляСм ΠΌΠ΅Ρ‚ΠΎΠ΄ GetChildControlType() Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса ControlBuilder Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π» Ρ‚ΠΈΠΏ класса Option Π² ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° Ρ‚Π΅Π³ с ΠΈΠΌΠ΅Π½Π΅ΠΌ <Option>. ЀактичСски, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ Π² максимальном количСствС ситуаций, ΠΌΡ‹ ΠΈΡ‰Π΅ΠΌ любоС имя Ρ‚Π΅Π³Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ оканчиваСтся строкой "option" с Π±ΡƒΠΊΠ²Π°ΠΌΠΈ Π² Π²Π΅Ρ€Ρ…Π½Π΅ΠΌ ΠΈΠ»ΠΈ Π½ΠΈΠΆΠ½Π΅ΠΌ рСгистрС.