2009-11-10 15 views
2

我很確定在ASP.NET 1.0/1.1的日子裏,在運行時創建的控件需要在Page LifecyclePage_Load事件之前添加(即在Page_Init之內)。在ASP.NET中添加動態控件,在1.1和2.0之間有區別嗎?

這裏有一個文章微軟在它(對於.NET 1.0/1.1):
HOW TO: Dynamically Create Controls in ASP.NET

注意當您在Web窗體上創建動態控件 ,你必須創建 控件,並添加他們將控制 集合在Page_Init 事件處理程序或Page_Load事件 處理程序中。否則,控件可能不會按預期方式運行。

但是,在這裏的一些帖子中,似乎不再是這種情況。在Page_Load內添加的控件似乎適用於其他人。一些職位包括:
creating dynamic control in asp.net
Viewstate - utter confusion.

我已經嘗試過自己,實際上它的工作,雖然我沒有做足夠的測試撈出任何異常行爲。

那麼Page_Load是一個安全的階段添加動態控件?或者它僅適用於.NET 2.0及以上版本?

回答

3

我已經用Reflector研究了這一點,並且Control類確實可以在動態添加它們時加快速度,無論何時添加它們。它完成了一切 - 加載viewstate/controlstate,調用回發事件,調用事件處理程序等等。我不知道ASP.NET 1.x版本中是否有所不同,但在2.0和更高版本中是這種情況。

至於「危險」 - 也有一些陷阱是沒有經驗的用戶可能會絆倒,所以建議您將它們添加在Page_Init或之前。 (請注意,PreInit事件僅適用於頁面本身,而不適用於母版頁或子控件)。關閉我的頭頂(我確信可能還會有更多):

  • 默認情況下viewstate在位置上加載。也就是說,它會在加載視圖狀態時忽略控件ID並考慮樹中的控件放置。如果動態控件在視圖狀態序列化時存在,但在反序列化時不存在,則錯誤的視圖狀態項可能會分配給錯誤的控件,從而導致異常。這可以通過一些設置來改變,儘管我現在懶得去搜索它們。
  • 由於「引進來加快速度」時發生的動態控制被添加到頁面中,某些事件的順序可能是意想不到的。例如,如果將一個TextBox控件添加到Page_PreRender事件的頁面中,則TextBox的Changed事件將在那裏發生。如果您的事件處理程序代碼依賴於PreRender之前發生的其他事件發生的事件,那麼您就搞砸了。
+0

@ Vilx-:你的文章是我讀過的關於這個問題的更全面的文章之一。 :) – 2009-11-10 15:28:32

+0

我正在處理定期動態添加的控件,所以我必須理解這一點。 :) – 2009-11-10 16:09:51

2

您可以隨時添加控件。但是,如果您在頁面加載之前添加它們,它們只能使用viewstate。

事實上,如果你檢查的.Net 2.0版本,您發佈的頁面生命週期環節,你會發現stilll這句話的PreInit事件下:

使用此事件的以下內容:.. 。創建或重新創建動態控件。

+0

@Joel:良好的漁獲!那麼它是否意味着儘可能多,我們應該始終在PreInit中創建動態控件? – 2009-11-10 14:21:56

+1

是的。很明顯,爲響應按鈕創建的控件需要在別處創建。但是,當爲回發創建_re-creating_控件時,PreInit絕對是正確的地方。 – 2009-11-10 14:22:44

+0

@ O.K.W,我們可以覆蓋的CreateChildControls,可以在此事件創建控制以及.. – 2009-11-10 14:23:34

1

Page_Load事件處理程序是添加控件的可接受位置。如果你重新閱讀你的筆記,你會注意到他們說明了這一點。

注意:當您在Web窗體上創建動態控件 ,你必須創建 控制和他們無論是在Page_Init 事件處理或在Page_Load 事件處理程序添加到控件 集合。否則,控件 可能無法按預期方式運行。

如果您鏈接到的ASP.NET 2.0文章的「添加控件的追趕事件」下,他們將討論如何通過頁面加速添加的控件。

+0

@Mike:天哪,我錯過了。我想我選擇消化我相信的東西。感謝您的突出。但喬爾的回答給出了不同的看法。 – 2009-11-10 14:30:39

相關問題