国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
asp.net控件開(kāi)發(fā)基礎(chǔ)(2)
http://www.cnblogs.com/Clingingboy/archive/2006/08/01/465397.html
上一篇:http://www.cnblogs.com/Clingingboy/archive/2006/07/30/463471.html
或許大家還對(duì)為何要重寫(xiě)Render方法存有疑惑,希望大家看看我舉的例子,能夠明白R(shí)ender方法和其他兩個(gè)方法的作用,然后真正明白為何一般情況下只須重寫(xiě)Render方法

我們知道我們每次編寫(xiě)控件時(shí),都需要重寫(xiě)Render方法,我們發(fā)現(xiàn)在Control類中很多方法可以重寫(xiě),但我們沒(méi)有去重寫(xiě)他們,我們需要遵循一個(gè)原則,在需要重載的時(shí)候再去重寫(xiě)他們

我們還是先來(lái)看看與Render方法相關(guān)的兩個(gè)方法
//RenderControl方法的基本實(shí)現(xiàn)
 public void RenderControl(HtmlTextWriter writer)
 
{
 
if(Visible)
 
{
 Render(writer);
 }

 }

 
//Render方法基本實(shí)現(xiàn)
 protected virtual void Render(HtmlTextWriter writer)
 
{
 RenderChildren(writer);
 }

 
//RenderChildren方式基本實(shí)現(xiàn)
 protected virtual void RenderChildren(HtmlTextWriter writer)
 
{
 
foreach (Control c in Controls)
 
{
 c.RenderControl(writer);
 }

 }

相信看過(guò)"ASP.NET服務(wù)器控件開(kāi)發(fā)技術(shù)與實(shí)例"這本書(shū)的人,肯定看過(guò)上面的一段代碼.

假設(shè)你不理解上面的流程(我也不一定理解,希望我的思路對(duì)你有幫助),我認(rèn)為有一種很好的方式來(lái)理解上面的流程,跟大家分享一下.

現(xiàn)在拋開(kāi)上面的代碼,我們來(lái)建一個(gè)簡(jiǎn)單的頁(yè)面,隨意的拖幾個(gè)控件到界面上,注意最后一個(gè)三panel控件,如下圖


圖一

我們知道,每個(gè)控件都有Visible和EnableViewState屬性,Visible用來(lái)設(shè)置控件是否被呈現(xiàn).


圖二

現(xiàn)在我們把button控件的Visible屬性設(shè)置為flase,我們看到了我們預(yù)期的效果,接著請(qǐng)啟用頁(yè)面跟蹤,這個(gè)很重要


圖三

在服務(wù)器上運(yùn)行這個(gè)頁(yè)面,大家可以在控件樹(shù)上看到下面畫(huà)面


圖四

(1)System.Web.UI.LiteralControl

大家可以看到,在我們定義的每個(gè)控件之間都有System.Web.UI.LiteralControl.
這里需要說(shuō)明的是,要理解任何不需要在服務(wù)器上處理的任何其他字符串.

如何理解呢?大家打開(kāi)這個(gè)運(yùn)行頁(yè)面的源代碼頁(yè)面,如下代碼,大家看到?jīng)]有,除了服務(wù)器控件外,我們有其他元素(不需要在服務(wù)器上處理的任何其他字符串),包括空格.

示例一
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head><title>
  鏃犳爣棰橀〉
</title></head>
<body>
 
<form name="form1" method="post" action="Default1.aspx" id="form1">
<div>
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTExNTUxMDYxODdkZHVaWm47e5anDettRKviGvS0nDWQ" />
</div>

 
<div>
 
<span id="Label1">Label</span><br />
 
<br />
 
<input name="TextBox1" type="text" id="TextBox1" /><br />
 
<br />
 
<br />
 
<br />
 
<div id="Panel1" style="height:50px;width:125px;">
  
 
</div>
 
 </div>
 
<div>

  
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWAgK/5/fTBwLs0bLrBrVw7YrSp5G/l4sJGPkKN/asFj2W" />
</div></form>
</body>
</html>

為了讓大家更加明白System.Web.UI.LiteralControl的意思的,讓我們來(lái)修改HTML頁(yè)面,說(shuō)明:以上代碼為運(yùn)行后的HTML源代碼.而不是我們所說(shuō)的源代碼,大家應(yīng)該明白我所指的源代碼的意思.

我們來(lái)修改代碼,注意:我把<form..以下的標(biāo)簽無(wú)空格的寫(xiě)在了一起.看下面修改后的代碼

示例二
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" Trace="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
 
<title>無(wú)標(biāo)題頁(yè)</title>
</head>
<body>
 
<form id="form1" runat="server"><asp:Label ID="Label1" runat="server" Text="Label"></asp:Label><asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><asp:Button ID="Button1" runat="server" Text="Button" Visible="False" /><asp:Panel ID="Panel1" runat="server" Height="50px" Width="125px"></asp:Panel></form>
</body>
</html>

運(yùn)行效果


圖五

現(xiàn)在發(fā)現(xiàn)控件之間已經(jīng)沒(méi)有System.Web.UI.LiteralControl了,因?yàn)槲胰サ袅丝崭?這個(gè)也說(shuō)明了一點(diǎn),如果代碼很亂的話會(huì)影響速度.現(xiàn)在大家應(yīng)該明白System.Web.UI.LiteralControl的意思了吧.

(2)大家繼續(xù)看圖四的Button1,大家會(huì)發(fā)現(xiàn)它呈現(xiàn)的大小字節(jié)數(shù)為0,因?yàn)槲覀冊(cè)O(shè)置了Button1的Visible值為False,所以未呈現(xiàn)此控件.

下面我們來(lái)理解這一點(diǎn),大家重新看到RenderControl方法,如果Visible值為True則呈現(xiàn)此控件.
if(Visible)
 Render(writer);

為了理解這個(gè)方法,我們來(lái)重寫(xiě)此方法,我們以第一次講的CreditCardForm3控件為例

我們重寫(xiě)RenderControl方法,把Render方法的代碼全部拷貝到RenderControl方法中,然后去掉Render方法

然后在asp.net頁(yè)面使用此控件,定義其Visible值為False

圖六

運(yùn)行這個(gè)例子以后,你會(huì)發(fā)現(xiàn)控件還是呈現(xiàn)了,就是因?yàn)槟阒貙?xiě)了RenderControl方法,使控件的Visible值無(wú)效了

所以我們就要加上一個(gè)判斷
if(Visible) {
}


否則的話,此方法呈現(xiàn)的內(nèi)容沒(méi)有Visible值.為了更加深刻理解這一點(diǎn),我們重寫(xiě)基類的RenderControl方法的方法.

base.RenderControl(writer);

你會(huì)發(fā)現(xiàn)在頁(yè)面呈現(xiàn)時(shí)的控件有兩個(gè),一個(gè)在RenderControl方法方法輸出,一個(gè)在Render方法輸出,因?yàn)?br>base.RenderControl方法調(diào)用了Render方法,當(dāng)設(shè)置控件Visible屬性為False時(shí),Render方法輸出的內(nèi)容被隱藏(未被呈現(xiàn),而RenderControl方法輸出的內(nèi)容仍然存在.現(xiàn)在大家應(yīng)該了解RenderControl方法的作用了吧.

如果服務(wù)器控件的 Visible 屬性設(shè)置為 true,則向頁(yè)呈現(xiàn)服務(wù)器控件的內(nèi)容,所以一般情況下我們不重寫(xiě)此方法.因?yàn)橐话憧丶夹枰猇isible 屬性,除非特殊情況.
圖七

(3)RenderChildren方法

再重新看到圖四,大家可以看到,我們拖放的控件是在屬于form1的子控件,panel控件是一個(gè)容器控件,因?yàn)橄旅鏇](méi)拖放控件,任何其他顯示的字符串表現(xiàn)為System.Web.UI.LiteralControl,大家可以拖幾個(gè)控件到panel里再重新運(yùn)行看看,會(huì)發(fā)現(xiàn)拖進(jìn)去的控件變?yōu)閜anel的子控件.最明顯的的測(cè)試方法是Wizard控件,拖放一個(gè)Wizard控件然后再測(cè)試你就會(huì)明白了.

RenderChildren方法則判斷當(dāng)前控件是否有子控件,如果有,則根據(jù)RenderControl方法判斷控件的Visible值來(lái)呈現(xiàn)控件.所以大家在重寫(xiě)Render方法時(shí),不重寫(xiě)基類Render方法時(shí),將無(wú)法實(shí)現(xiàn)RenderChildren方法.帶來(lái)的后果將是無(wú)法呈現(xiàn)子控件.

下面我們來(lái)測(cè)試一下.我們還是以CreditCardForm3控件為例子(請(qǐng)先把RenderControl方法的內(nèi)容全注釋掉),當(dāng)未重實(shí)現(xiàn)RenderChildren方法時(shí)則無(wú)法呈現(xiàn)子控件內(nèi)容,請(qǐng)啟動(dòng)跟蹤

將發(fā)現(xiàn)其子控件呈現(xiàn)字節(jié)為0

圖八

由于CreditCardForm3繼承了CreditCardForm2,所以重寫(xiě)基類Render方法將會(huì)重復(fù)輸出,我們可以直接在Render方法中重寫(xiě)RenderChildren方法.再來(lái)測(cè)試.將會(huì)發(fā)現(xiàn)有些變化

發(fā)現(xiàn)其子控件呈現(xiàn)字節(jié)并非為0,而是10

圖九

說(shuō)明其子控件還是存在東西的,只不過(guò)沒(méi)有用而已,所以大家可以根據(jù)實(shí)際需求來(lái)確實(shí)是否要重寫(xiě)RenderChildren方法,一般的話都會(huì)重寫(xiě)Render方法,這樣保險(xiǎn)一點(diǎn)

好了,現(xiàn)在再來(lái)回顧下剛開(kāi)始給出的代碼,通過(guò)上面的試驗(yàn),你是否明白了?

呈現(xiàn)控件的步驟(注意:下面三個(gè)方法都可以呈現(xiàn),不過(guò)我們已經(jīng)說(shuō)過(guò)了,像在RenderControl方法用HtmlTextWriter預(yù)先輸出的話,就喪失Visible的功能(說(shuō)不定你就不需要這個(gè)功能,那時(shí)你就可以重寫(xiě)這個(gè)方法了)

(1)RenderControl方法

先判斷其Visible然后調(diào)用Render方法

(2) Render方法

使用HtmlTextWriter將標(biāo)記字符和文本輸出然后調(diào)用RenderChildren方法

(3)RenderChildren方法

判斷當(dāng)前控件是否有子控件,然后再調(diào)用RenderControl方法根據(jù)子控件的Visible值輸出子控件.

我們了解上面三個(gè)方法后,就會(huì)知道,一般情況下,我們無(wú)須重寫(xiě)RenderControl方法和RenderChildren方法.所以最合適的就是重寫(xiě)Render方法了.說(shuō)了一大堆.目的就是為了說(shuō)明為什么要重寫(xiě)Render方法.

上次,忘了把代碼傳上了,不小心只上傳了dll文件,不好意思.這次就寫(xiě)這么多.希望大家能夠真正明白.大家可以適當(dāng)?shù)男薷拇a,這樣你會(huì)發(fā)現(xiàn)更多.

參考文章:ASP.NET2.0服務(wù)器控件之Render方法

點(diǎn)擊下載示例代碼
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
關(guān)于asp.net的render方法介紹
從零開(kāi)始開(kāi)發(fā)服務(wù)器控件
日歷控件綁定TextBox asp.net
ASP.Net請(qǐng)求處理機(jī)制初步探索之旅
ASP.NET服務(wù)器控件開(kāi)發(fā)(2)
ASP.NET頁(yè)面執(zhí)行順序
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服