2012-02-23 95 views
2

This文章指出,Page_PreInit應該用來在哪個事件中應該設置動態控制屬性?

創建或重新創建動態控件。

例如:

Button button = new Button(); 
somePanel.Controls.Add(button); 

好。我明白。

然而,它也表示:

如果請求是回發,所述控件的值尚未 是來自於視圖狀態恢復。如果您在此 階段設置控件屬性,則其值可能會在下一個事件中被覆蓋。

咦?

這是否意味着我應該做的就是創建按鈕,但不設置按鈕的任何成員?

例如:

Button button = new Button() { CommandArgument="arg" }; 
somePanel.Controls.Add(button); 

這是否意味着,在這個事件中設置CommandArgument是不正確/不推薦/可能會導致錯誤/意外的行爲?

假設是不正確,這將導致我認爲一個人會做這樣的事情:

protected void Page_PreInit(object sender.....) 
{ 
    somePanel.Controls.Add((new Button()); 
} 

protected void Page_Init(object sender.....) 
{ 
    foreach(Button button in somePanel.Controls) 
     button.CommandArgument = "arg"; 
} 

這是正確的方式?

最後,在哪個事件中應該設置動態控制屬性?

+1

做什麼文章說..有它在init中,然後有一些如果IsPostBack代碼..你可以做預渲染或PreInit以及我的意見 – MethodMan 2012-02-23 19:25:56

+0

@DJKRAZE - 我很困惑什麼文章狀態,因此問題:)。 – 2012-02-23 19:29:57

回答

1

對於最後一個問題,沒有單一的答案取決於屬性的性質,它可能或可能沒有意義在特定方法中設置值。

如果請求是回發,則控件的值尚未從視圖狀態恢復爲 。如果您在此 階段設置控件屬性,則其值可能會在下一個事件中被覆蓋。

可能是這裏的關鍵詞。如果考慮一些可能會隨着表單經歷各種狀態而發生變化的屬性,那麼這裏就必須注意可能被覆蓋的內容,以及這是否是壞事的問題,因爲它可能是更新後的價值應該是持久的,而在其他情況下,原始價值可能會更好,例如,如果有人想將表單重置爲初始狀態。

我的建議是做一些試驗和錯誤,看看有什麼作用,因爲我記得使用動態控制,這在某些情況下可能會非常棘手,無法正常管理。