Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠ½ΠΎΠ³ΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π½Π΅ΡΠ»ΠΎΠΆΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ° ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠ½ΠΎΠ³ΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΠΈΡΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΈΠ· ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ ΡΠ°Π·Π΄Π΅Π»Π° Ρ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ ΡΠΈΠΊΠ»Π°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΠΌΠ΅Π»Π°ΡΡ Π½Π° ΡΠ΅ΡΡΠΎΠ²ΠΎΠΉ ΡΠΎΡΠΌΠ΅.
ΠΠ°Π·ΠΎΠ²Π΅ΠΌ ΡΡΠΎΡ ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡΠ½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ 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" Ρ Π±ΡΠΊΠ²Π°ΠΌΠΈ Π² Π²Π΅ΡΡ Π½Π΅ΠΌ ΠΈΠ»ΠΈ Π½ΠΈΠΆΠ½Π΅ΠΌ ΡΠ΅Π³ΠΈΡΡΡΠ΅.