2012-12-04 46 views
1

我有一個複合服務器控件,在這裏我實現的CreateChildControls。 此控件是一個網格,其中還包括分頁和排序控件。的CreateChildControls兩次

當單擊一個排序鏈接時,首先調用CreateChildControls,然後事件處理程序和事件處理程序再次調用CreateChildControls,以便使用新排序順序重新生成控件。

有沒有辦法跳過的CreateChildControls時回傳被控制事件處理程序觸發?

這是甚至可能或者我必須在事件處理程序之前通過CreateChildControls,因此asp.net可以將事件掛鉤到現有控件?

+0

是很正常的第一調用的CreateChildControls,這樣的事件處理程序可以掛接。爲什麼這是你的問題? – Joe

+0

我做了一些沉重的反思,而且我沒有預先優化,但如果我調用過'CreateChildControls'太多了,這是一個不容易的事情。 –

回答

3

我在寫這個問題的時候並不知道,但這實際上是自定義控件的自然生命週期的一部分。

CreateChildControls()每次調用EnsureChildControls()被調用。竅門是在第一次調用結束時將ChildControlsCreated屬性設置爲CreateChildControls(),因此整個過程不會發生一次以上。

+0

EnsureChildControls(MSDN):'此方法首先檢查ChildControlsCreated屬性的當前值。如果該值爲false,CreateChildControls方法是called.'所以你不需要任何額外的屬性,以確保子控件已經創建 –

+0

@YuriyRozhovetskiy - 這就是我說的......如果覆蓋'的CreateChildControls()'使一定要設置'ChildControlsCreated'。這是關鍵。 –

+0

所以EnsureChildControls()確實設置了ChildControlsCreated = true,但它看起來像Elad說的那樣有意義,這樣你就可以避免對ChildControlsCreated的調用 – Sameer

0

我有類似的情況,但我有兩件事情:我加載控件,然後我顯示的信息基於用戶以前的選擇。當用戶更改下拉列表或單擊按鈕時,該頁面將重新加載,並將其選項添加到查詢字符串中。所以,我的解決方案是這樣的:

protected override void CreateChildControls() 
{ 
    base.CreateChildControls(); 
    AddControls(); 
    if (Page.IsPostBack) 
     return; 
    ShowProcedure() // The time-intensive code that I don't want to call twice. 
} 

AddControls填充控件,並啓用回發選項。 ShowProcedure使用查詢字符串中的值來顯示大量數據。這樣,我不會在CURRENT值上調用ShowProcedure。