轉(zhuǎn)帖|其它|編輯:郝浩|2010-11-29 16:19:03.000|閱讀 590 次
概述:有時(shí)候,可能希望在組件中通過某種方式朝WEBFORM中寫入一段JAVASCRIPT代碼,或者希望將組件的某個(gè)方法掛接到PAGE對(duì)象的某個(gè)事件上,這時(shí)候,就要訪問PAGE對(duì)象.在
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
有時(shí)候,可能希望在組件中通過某種方式朝WEBFORM中寫入一段JAVASCRIPT代碼,或者希望將組件的某個(gè)方法掛接到PAGE對(duì)象的某個(gè)事件上,這時(shí)候,就要訪問PAGE對(duì)象.在<ASP.NET組件設(shè)計(jì)>一書中,黃忠成先生用的方法如下:
1,為組件創(chuàng)建Designer,在Designer中覆寫Initialize方法,如下所示
public override Initialize(IComponent component)
{
IContainer Ic=component.Site.Container;
foreach(IComponent c in Ic.Components)
if(c is Page)
((類名)component)._Page=(Page)c;
base.Initialize(component)
}
黃先生的這個(gè)方法對(duì)于派生自Control,WebControl,Component的組件都是非常有效的,上面的代碼原理是為組件編寫一個(gè)Designer,在Designer的Initialize方法中,通過遍歷組件的容器對(duì)象來找到Page對(duì)象,然后將此Page對(duì)象指定給組件的Page類型的公有屬性_Page上,于是,在組件內(nèi)部,引用_Page屬性就可以了.上面的做法的結(jié)果是當(dāng)你將設(shè)計(jì)好的組件拖入到WEBFORM中的時(shí)候,Visual Studio.NET的Designer會(huì)自動(dòng)遵照組件的DISGNER的指示,遍歷該組件的容器,然后找到PAGE對(duì)象,并將其賦給該組件的_Page屬性,實(shí)際上,還不是這么簡單的.實(shí)際上,在拖入組件的時(shí)候,VS.NET會(huì)在WEBFORM的代碼文件中InitializeComponent方法中加入以下代碼:
組件名稱._Page=this;
InitializeComponent這個(gè)方法是每個(gè)WEBFORM都有的,它是VS自動(dòng)產(chǎn)生的,它的作用是初始化頁面中各個(gè)組件,當(dāng)頁面在Init初始化時(shí)(OnInit方法),會(huì)調(diào)用此方法,所以,實(shí)際上,黃先生的方法是利用VS.NET IDE強(qiáng)大的代碼生成功能和組件Designer來自動(dòng)產(chǎn)生初始化組件屬性以達(dá)到引用Page對(duì)象的目的(看過黃先生該書的人應(yīng)該有強(qiáng)列印象,因?yàn)閃EBTIMER,WEBTIMER2,WEBDIALOG幾乎都采用此法)
上面方法中,不少人有疑問.第一是,為什么在引用組件的容器時(shí)不用component.Container而是用component.Site.Container呢?實(shí)際上Container就是組件的公有屬性呀.如果你這么做了,你會(huì)得到一個(gè)NULLEXCEPTION異常.為什么呢?我也不知道,不過,在<組件設(shè)計(jì)>一書的"與IDE共舞"一章,講述了CONTAINER,COMPONENT,SITE三種對(duì)象間的聯(lián)系,實(shí)際上,Component不直接與Container聯(lián)系的,或者這個(gè)可以稱為原因吧
第二,為什么拖入組件后,設(shè)計(jì)器產(chǎn)生的代碼是"組件名稱._Page=this;"呢,因為在WEBFORM的代碼中this就是指PAGE對(duì)象本身
以上方法不是不好,只是不夠直觀而已
實(shí)際上,可以更方便的來引用Page對(duì)象
首先,派生于Control以及WebControl的對(duì)象可以直接用this.Page來直接引用Page對(duì)象
對(duì)于派生于Component的對(duì)象,則可以借助與上面類似的代碼來完成,不過,不再需要在Designer中實(shí)現(xiàn),也不需要在拖入時(shí)初始化屬性
IContainer Ic=this.Site.Container;
foreach(IComponent c in Ic.Components)
if(c is Page)
this._Page=(Page)c;
非常簡單,完成后_Page對(duì)象就是WEBFORM的一個(gè)引用了,就可以使用了
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:博客轉(zhuǎn)載