100165702.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 706 行 · 第 1/3 页
HTM
706 行
lang=EN-US>Label</span><span style='font-family:宋体'>控件派生一个控件,并重写其</span><span
lang=EN-US>Render()</span><span style='font-family:宋体'>方法,以输出彩色的文本。为了保持本章中控件示例的独立性,我们将在必要时创建新的源文件。因此,对于这个控件而言,要给</span><span
lang=EN-US>PCSCustomWebControls </span><span style='font-family:宋体'>项目添加一个新的</span><span
lang=EN-US>.cs</span><span style='font-family:宋体'>代码文件</span><span lang=EN-US>RainbowLabel.cs</span><span
style='font-family:宋体'>,并添加下面的代码:</span></p>
<p class=2 style='margin-top:8.15pt;margin-right:0cm;FTEL:0cm;
margin-left:21.45pt;FTEL:.0001pt;FTEL:18.45pt'><span
lang=EN-US>using System;</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>using
System.Web.UI;</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>using
System.Web.UI.WebControls;</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>using
System.ComponentModel;</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>using
System.Drawing;</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt;line-height:13.0pt'><span
lang=EN-US> </span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt;line-height:13.0pt'><span
lang=EN-US>namespace PCSCustomWebControls</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt;line-height:13.0pt'><span
lang=EN-US>{</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt;line-height:13.0pt'><span
lang=EN-US> public class RainbowLabel :
System.Web.UI.WebControls.Label</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt;line-height:13.0pt'><span
lang=EN-US> {</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt;line-height:13.0pt'><span
lang=EN-US> private Color[] colors = new Color[]
{Color.Red, Color.Orange,</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
Color.Yellow,</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
Color.GreenYellow,</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
Color.Blue, Color.Indigo,</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
Color.Violet};</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US> </span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
protected override void Render(HtmlTextWriter output)</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
{</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
string text = Text;</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
for (int pos=0; pos < text.Length; pos++)</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
{</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
int rgb = colors[pos % colors.Length].ToArgb() & 0xFFFFFF;</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
output.Write("<font color='#" + rgb.ToString("X6") +
"'>"</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
+ text[pos] + "</font>");</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
}</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
}</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
}</span></p>
<p class=2 style='margin-top:0cm;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>}</span></p>
<p class=MsoNormal><span style='font-family:宋体'>这个类派生于现有的</span><span
lang=EN-US>Label</span><span style='font-family:宋体'>控件</span><span lang=EN-US>(System.Web.UI.WebControls.Label)</span><span
style='font-family:宋体'>,并且它不需要任何额外的属性,因为有一个继承的</span><span lang=EN-US>Text</span><span
style='font-family:宋体'>属性就可以了。我们添加了新的私有字段</span><span lang=EN-US>colors[]</span><span
style='font-family:宋体'>,它包含一个颜色数组,在输出文本时将循环这个数组。</span></p>
<p class=MsoNormal><span style='font-family:宋体'>该控件的主要功能在</span><span
lang=EN-US>Render()</span><span style='font-family:宋体'>中,我们已经重写了这个</span><span
lang=EN-US>Render()</span><span style='font-family:宋体'>,因为要改变</span><span
lang=EN-US>HTML</span><span style='font-family:宋体'>输出。显示的字符串是从</span><span
lang=EN-US>Text</span><span style='font-family:宋体'>属性中得到的,根据</span><span
lang=EN-US>colors[]</span><span style='font-family:宋体'>数组中的颜色值,各个字符将显示为不同的颜色。</span></p>
<p class=MsoNormal><span style='font-family:宋体'>为了测试这个控件,需要把它添加到</span><span
lang=EN-US>PCSCustomWebControlsTestApp</span><span style='font-family:宋体'>的窗体上结果如图</span><span
lang=EN-US>27-10</span><span style='font-family:宋体'>所示:</span></p>
<p class=a6 style='margin-top:3.25pt;margin-right:0cm;FTEL:0cm;
margin-left:21.45pt;FTEL:.0001pt;FTEL:18.45pt'><span
lang=EN-US> <form method="post"
runat="server" ID="Form1"></span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
<PCS:RainbowLabel
Runat="server" Text="Multicolored label! "</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
ID="rainbowLabel1"/></span></p>
<p class=a6 style='margin-top:0cm;margin-right:0cm;FTEL:4.9pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
</form></span></p>
<p align=center><span lang=EN-US><img width=340 height=138
src="27/image010.jpg"></span></p>
<p align=center style='FTEL:8.15pt'><span style='font-family:宋体'>图</span><span
lang=EN-US> 27-10</span></p>
<h4 style='FTEL:21.45pt'><span lang=EN-US>2. </span><span
style='font-family:黑体'>维护定制控件的状态</span></h4>
<p class=MsoNormal><span style='font-family:宋体'>每次在服务器上创建控件以响应服务器请求时,都要从头开始创建控件。这表示控件的所有简单字段都将重新初始化。为了让控件在请求之间保持其状态不变,控件必须使用在客户端维护的</span><span
lang=EN-US>ViewState</span><span style='font-family:宋体'>,这意味着必须使用它编写控件。</span></p>
<p class=MsoNormal><span style='font-family:宋体'>为了阐明这个问题,给</span><span
lang=EN-US>RainbowLabel</span><span style='font-family:宋体'>控件添加一个额外的功能,即添加一个</span><span
lang=EN-US>Cycle()</span><span style='font-family:宋体'>方法,它循环可用的颜色,利用所保存的</span><span
lang=EN-US>offset</span><span style='font-family:宋体'>字段就可以决定,在所显示的字符串中,第一个字母显示为什么颜色。这个字段需要控件的</span><span
lang=EN-US>ViewState</span><span style='font-family:宋体'>,使该字段在请求之间保持不变。</span></p>
<p class=MsoNormal><span style='font-family:宋体'>下面的代码显示了使用或未使用</span><span
lang=EN-US>ViewState</span><span style='font-family:宋体'>存储器的两种情况,阐明了两种易犯的错误。首先看一看未使用</span><span
lang=EN-US>ViewState</span><span style='font-family:宋体'>的情况:</span></p>
<p class=a6 style='margin-top:8.15pt;margin-right:0cm;FTEL:0cm;
margin-left:21.45pt;FTEL:.0001pt;FTEL:18.45pt'><span
lang=EN-US> public class RainbowLabel : System.Web.UI.WebControls.Label</span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
{</span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
private Color[] colors = new Color[] {Color.Red, Color.Orange,</span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
Color.Yellow,</span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
Color.GreenYellow,</span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
Color.Blue, Color.Indigo,</span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
Color.Violet};</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
private int offset = 0;</span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US> </span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
protected override void Render(HtmlTextWriter output)</span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
{</span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
string text = Text;</span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
for (int pos=0; pos < text.Length; pos++)</span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
{</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
int rgb = colors[(pos + offset) % colors.Length].ToArgb()</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
& 0xFFFFFF;</span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
output.Write("<font color='#" + rgb.ToString("X6") +
"'>"</span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
+ text[pos] + "</font>"); </span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
}</span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
}</span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
public void Cycle()</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
{</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
offset = ++offset;</span><span class=MsoCommentReference><span lang=EN-US
style='font-size:8.0pt;display:none;letter-spacing:.2pt'> </span></span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
}</span></p>
<p class=a6 style='margin-top:0cm;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US> }</span></p>
<p class=MsoNormal><span style='font-family:宋体'>这里把</span><span lang=EN-US>offset</span><span
style='font-family:宋体'>字段初始化为</span><span lang=EN-US>0</span><span
style='font-family:宋体'>,然后允许</span><span lang=EN-US>Cycle()</span><span
style='font-family:宋体'>方法递增它,当</span><span lang=EN-US>offset</span><span
style='font-family:宋体'>字段的值增加到</span><span lang=EN-US>7(colors</span><span
style='font-family:宋体'>数组的颜色数</span><span lang=EN-US>)</span><span
style='font-family:宋体'>时,就使用%运算符把它重置为</span><span lang=EN-US>0</span><span
style='font-family:宋体'>。</span></p>
<p class=MsoNormal><span style='font-family:宋体'>为了进行测试,需要一种调用</span><span
lang=EN-US>cycle()</span><span style='font-family:宋体'>的方式,最简单的方式就是在窗体上添加按钮:</span></p>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?