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