自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

全面介紹ASP.NET動(dòng)態(tài)控件

開(kāi)發(fā) 后端
本文介紹ASP.NET動(dòng)態(tài)控件遇到的第一類(lèi)問(wèn)題就是跨頁(yè)面生命周期時(shí)無(wú)法自動(dòng)保存,你必須每次手動(dòng)創(chuàng)建。

我認(rèn)為感性認(rèn)識(shí)是理性認(rèn)識(shí)不可缺乏的基礎(chǔ)條件,所以在很理論性的解釋ASP.NET頁(yè)面生命周期之前,先通過(guò)一些大家可能都遇到過(guò)的例子給大家一個(gè)感性認(rèn)識(shí)。

ASP.NET動(dòng)態(tài)控件遇到的第一類(lèi)問(wèn)題就是跨頁(yè)面生命周期時(shí)無(wú)法自動(dòng)保存,你必須每次手動(dòng)創(chuàng)建。舉個(gè)簡(jiǎn)單的例子,例如現(xiàn)在我有一個(gè)DropDownList,有三個(gè) ListItem,值分別是"0", "1", "2",在我設(shè)置了AutoPostBack之后,我希望SelectedIndexChanged時(shí)根據(jù)我選擇的ListItem數(shù)值動(dòng)態(tài)創(chuàng)建相應(yīng)數(shù)量的TextBox,簡(jiǎn)單的代碼如下:

  1. protectedvoiddropDownList_SelectedIndexChanged(objectsender,EventArgse)  
  2. {  
  3. for(inti=0;i<dropDownList.SelectedIndex;i++)  
  4. {  
  5. TextBoxdynamicTextBox=newTextBox();  
  6. this.Form.Controls.Add(dynamicTextBox);  
  7. }  

需要解釋一下的是,直接用dropDownList.SelectedIndex是為了省事,因?yàn)長(zhǎng)istItem的值本身也就是從0開(kāi)始的順序整數(shù)。

測(cè)試一下我們這個(gè)小小的ASP.NET程序有沒(méi)有問(wèn)題,結(jié)果當(dāng)然是沒(méi)問(wèn)題的,你選擇了哪個(gè)數(shù)值就真的會(huì)有相應(yīng)數(shù)量的TextBox出現(xiàn),好簡(jiǎn)單哦!我們?cè)偃右粋€(gè)Button到頁(yè)面上看看又會(huì)怎樣,這時(shí)候你就會(huì)發(fā)現(xiàn)如果通過(guò)點(diǎn)擊Button導(dǎo)致PostBack,那么動(dòng)態(tài)創(chuàng)建的TextBox就沒(méi)掉了,看起來(lái)事情并不如我們期望的那么簡(jiǎn)單。

“我們已經(jīng)知道這個(gè)問(wèn)題啦,快點(diǎn)給出解決方案啦”——如果你急需要一個(gè)解決方案,請(qǐng)直接看本篇文章的最后幾段。我知道很多人是因?yàn)楫?dāng)前有一個(gè)棘手的問(wèn)題才來(lái)翻看這類(lèi)文章的,但我也不能因此而忽視了另外一部分人的需求——他們希望由淺入深地了解這個(gè)問(wèn)題,并且得到解決方案的同時(shí)得到完整解釋。

接下來(lái)我們繼續(xù)來(lái)看第二類(lèi)問(wèn)題,動(dòng)態(tài)創(chuàng)建控件的事件觸發(fā)不正常。我們又來(lái)寫(xiě)一段簡(jiǎn)單代碼:

  1. protectedvoidPage_Load(objectsender,EventArgse)  
  2. {  
  3. TextBoxdynamicTextBox=newTestingTextBox();  
  4. dynamicTextBox.ID="DynamicTextBox" 
  5. dynamicTextBox.Text="InitData" 
  6. dynamicTextBox.TextChanged+=newEventHandler(dynamicTextBox_TextChanged);  
  7. this.Form.Controls.Add(dynamicTextBox);  
  8. }  
  9. voiddynamicTextBox_TextChanged(objectsender,EventArgse)  
  10. {  
  11. this.Trace.Write("DynamicTextBox","TextChanged");  

由于用到了Trace,測(cè)試的時(shí)候別忘記把Trace打開(kāi)哦。

我們?cè)偃右粋€(gè)LinkButton到頁(yè)面上,目的僅僅是為了觸發(fā) PostBack,然后看看事件是否正常。奇怪的事情發(fā)生了,在修改TextBox的值之前,無(wú)論怎么點(diǎn)那個(gè)LinkButton,一切都非常正常,TextChanged事件確實(shí)不發(fā)生。修改了TextBox的值之后點(diǎn)LinkButton,事情也還正常,TextChanged事件發(fā)生了。但之后就出問(wèn)題了,無(wú)論你是否修改了TextBox的值,TextChanged總是在每一次PostBack時(shí)都被觸發(fā)。

這個(gè)問(wèn)題很怪異對(duì)嗎?事件既非完全不觸發(fā),也非總是觸發(fā)。其實(shí)答案隱藏在我之前那篇《深入理解 ViewState》里面,去讀一讀那篇文章,或許你自己也能夠解釋為什么會(huì)這樣。

動(dòng)態(tài)創(chuàng)建的控件或許還存在第三類(lèi)、第四類(lèi)問(wèn)題,在此就不一一列舉了。我相信被動(dòng)態(tài)控件問(wèn)題困擾過(guò)的ASP.NET程序員絕對(duì)不少,而未遇到過(guò)此類(lèi)問(wèn)題的程序員看到上述兩個(gè)問(wèn)題也未必能給出解決方案和正確解釋。

在提供問(wèn)題的解決方案之前首先要說(shuō)明一點(diǎn),作為ASP.NET程序員的你需要在某一時(shí)刻某一地方讓控件動(dòng)態(tài)出現(xiàn)時(shí),就立即在該處寫(xiě)代碼動(dòng)態(tài)創(chuàng)建并添加控件,這往往都是錯(cuò)誤的做法。正確的做法是向后退三步再抬頭看,這時(shí)候你看到的就不是你要讓控件動(dòng)態(tài)出現(xiàn)的那一個(gè)準(zhǔn)確的時(shí)刻和地方,你應(yīng)該看到ASP.NET頁(yè)面生命周期的全貌,接著你就應(yīng)該清楚你的代碼該加去哪里了。

好了,是時(shí)候給出最直接的解決方案了,唯一的解決方案就是讓你看清楚ASP.NET頁(yè)面生命周期的全貌,而其中最佳的入門(mén)方式就是學(xué)習(xí)控件設(shè)計(jì)。雖然上面把ASP.NET動(dòng)態(tài)控件說(shuō)成一個(gè)復(fù)雜的問(wèn)題,然而大家天天都在用動(dòng)態(tài)控件,只不過(guò)ASP.NET動(dòng)態(tài)控件已經(jīng)被封裝到一個(gè)靜態(tài)控件里了。例如復(fù)雜的GridView控件,它會(huì)自動(dòng)根據(jù)每一列的性質(zhì)來(lái)生成對(duì)應(yīng)控件,如果是模板列還要分析模板中的內(nèi)容來(lái)生成模板中定義的控件,這些控件都算是動(dòng)態(tài)控件,為什么PostBack不會(huì)讓他們自動(dòng)消失,為什么為它們添加的事件從來(lái)不會(huì)錯(cuò)誤觸發(fā),在你學(xué)習(xí)完控件設(shè)計(jì)之后就會(huì)一清二楚。

關(guān)于控件設(shè)計(jì),我推薦大家買(mǎi)Wrox(樂(lè)思)的書(shū)來(lái)看,是以控件設(shè)計(jì)為主題的那兩本,不會(huì)很厚,很快能看完。如果你在使用的是ASP.NET 1.x,或者你一定要看中文版的書(shū),那么ASP.NET服務(wù)器控件高級(jí)編程將是一本很適合你的書(shū)。至于ASP.NET 2.0的則有Professional ASP.NET 2.0 Server Control and Component Development,英文版今年8月才發(fā)布,根據(jù)清華出版社的慣例至少要等半年才可能有對(duì)應(yīng)中文版。

既然連解決方案都給出了,這個(gè)系列的文章繼續(xù)寫(xiě)下去還有什么意義嗎?書(shū)上能給你的只是一個(gè)臨摹著去做就不會(huì)出錯(cuò)的模式,以及一個(gè)聽(tīng)起來(lái)很合理的解釋。到底為什么臨摹這種模式去做就符合ASP.NET的大模式(主要是編譯模型和頁(yè)面生命周期),ASP.NET的大模式到底是怎樣的,這就是我接下來(lái)要寫(xiě)的東西。

【編輯推薦】

  1. 微軟發(fā)布ASP.NET MVC 2預(yù)覽版 多項(xiàng)功能更新
  2. ASP.NET服務(wù)器自定義控件安全準(zhǔn)則
  3. ASP.NET編程規(guī)范之編碼規(guī)范淺析
  4. 關(guān)于ASP.NET Session的一點(diǎn)認(rèn)識(shí)
  5. ASP.NET編程工具ASP.NET Web Matrix詳細(xì)介紹
責(zé)任編輯:佚名 來(lái)源: yesky
相關(guān)推薦

2009-07-29 10:35:51

ASP.NET緩存

2009-08-05 10:36:08

開(kāi)發(fā)ASP.NET

2009-08-05 15:57:03

ASP.NET控件ID

2009-07-21 13:30:59

JSP技術(shù)ASP.NET

2011-07-12 15:17:02

ASP.net服務(wù)器控件

2009-07-29 10:02:49

ASP.NET上傳

2009-07-29 09:14:36

ASP.NET網(wǎng)站

2009-07-21 10:40:36

ASP.NET Pro

2009-07-29 17:26:39

ASP.NET頁(yè)面

2009-07-23 14:17:41

2009-09-10 14:02:08

LINQ ASP.NE

2009-07-20 16:12:21

ASP.NET Fra

2009-07-27 17:00:29

ASP.NET主機(jī)

2009-08-19 09:23:40

ASP.NET Rou

2009-07-29 17:23:17

ASP.NET表單

2009-07-22 16:05:34

ASP.NET AJA

2009-08-04 10:43:59

ASP.NET控件開(kāi)發(fā)

2009-08-19 13:44:00

ASP.NET Lis

2009-07-29 13:50:26

UpdatePanelASP.NET

2009-08-17 09:24:25

ASP.NET控件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)