100165702.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 706 行 · 第 1/3 页
HTM
706 行
<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> <form method="post"
runat="server" ID="Form1"></span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
<PCS:RainbowLabel Runat="server" Text="Multicolored
label!"</span></p>
<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
ID="rainbowLabel1"/></span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
<asp:Button Runat="server" ID="cycleButton"</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
Text="Cycle colors"/></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>
</form></span></p>
<p class=MsoNormal><span style='font-family:宋体'>添加下面的事件处理程序,具体方法是在设计视图中双击按钮,添加下面的代码</span><span
lang=EN-US>(</span><span style='font-family:宋体'>需要把保护级别设为</span><span
lang=EN-US>protected)</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> protected void cycleButton_Click(object
sender, System.EventArgs e)</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>
this.rainbowLabel1.Cycle();</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></p>
<p class=MsoNormal><span style='font-family:宋体'>在请求之间,如果这个控件的状态在服务器上保持不变,它就会正常工作,因为</span><span
lang=EN-US>offset</span><span style='font-family:宋体'>字段将保持控件的状态,我们就不必再担心什么了。但是,这项技术对于</span><span
lang=EN-US>Web</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></p>
<p class=MsoNormal><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=2 style='margin-top:8.15pt;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>ViewState["_offset"]
= offset;</span></p>
<p class=MsoNormal><span lang=EN-US>ViewState</span><span style='font-family:
宋体'>由名称和值对组成,这里使用的是</span><span lang=EN-US>_offset</span><span
style='font-family:宋体'>。不必声明</span><span lang=EN-US>_offset</span><span
style='font-family:宋体'>,因为在第一次使用代码时会自动创建它。</span></p>
<p class=MsoNormal><span style='font-family:宋体'>类似地,可以使用下面的代码检索状态:</span></p>
<p class=2 style='margin-top:8.15pt;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>offset =
(int)ViewState["_offset"];</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=MsoNormal><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><span
lang=EN-US>offset</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>
...</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
private int offset</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>
get</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>
object rawOffset = ViewState["_offset"];</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
if (rawOffset != null)</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>
return (int)rawOffset;</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>
else</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>
ViewState["_offset"] = 0;</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
return 0;</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>
set</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>
ViewState["_offset"] = value;</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=a6 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>Cycle()</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></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>public string Name</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>
get</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>
return (string)ViewState["_name"];</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>
set</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>
ViewState["_name"] = value;</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>ViewState</span><span
style='font-family:宋体'>的使用,还要考虑子控件的情况。如果控件有子控件,并要在多个页面上使用,则将出现默认状态下子控件共享</span><span
lang=EN-US>ViewState</span><span style='font-family:宋体'>的问题。大多数情况下,这是我们所不愿看到的。幸运的是,这个问题的解决方案非常简单。在父控件上执行</span><span
lang=EN-US>InamingContainer</span><span style='font-family:宋体'>,可以迫使子控件在</span><span
lang=EN-US>ViewStata</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>ASP.NET</span><span style='font-family:宋体'>服务器解释的一个标记一样。在下一小节中将需要这样做。</span></p>
</div>
<!-- page -->
<div class="page" style="text-align: center">
<a href="100165701.htm">上一页</a> <a href="index.html">首页</a> <a href="100165703.htm">下一页</a>
</div>
<div style="margin: 0px auto; width: 700px; border: solid 1px #0b5f98;">
<div style="float: left; width: 16px; background-color: #0b5f98; color: White; padding: 1px;">
图书导读
</div>
<div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
<!--导读-->
<h1 id="divCurrentNode2" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100165702.htm'><font color='red'>27.2.2 基本的定制控件</font></a></h1>
<div id="divRealteNod2" style="padding-left: 2px">
<div style='float:left;width:49%'>·<a href='100165699.htm'>27.1 用户控件</a></div><div style='float:right;width:49%'>·<a href='100165700.htm'>27.2 定制控件</a></div><div style='float:left;width:49%'>·<a href='100165701.htm'>27.2.1 定制控件的项目配置</a></div><div style='float:right;width:49%'>·<a href='100165703.htm'>27.2.3 创建合成的定制控件</a></div><div style='float:left;width:49%'>·<a href='100165704.htm'>27.3 测验民意的投票控件</a></div><div style='float:right;width:49%'>·<a href='100165705.htm'>27.3.1 Candidate 控件</a></div></div>
</div>
</div>
</div>
<!-- 评论 -->
<!-- 今日推荐 -->
</div>
<!-- 页脚 -->
<div id="foot">
<img src="../../book/readbook.aspx@node=5702&bookid=16&bookname=27.2.2++_25bb_25f9_25b1_25be_25b5_25c4_25b6_25a8_25d6_25c6_25bf_25d8_25bc_25fe" alt="" width="0" height="0" />
<style>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?