雖然看起來「創建服務器控件」的「正確」方式是構造CreateChildControls調用中的所有子控件。但是由於很難知道什麼時候會被調用(這是整個點作爲性能優化),所以我在OnInit或OnLoad中看到我們的大部分開發人員都在構建它。這工作99%的案件。我們不得不使用CreateChildControls嗎?當「必須」我使用asp.net CreateChildControls()?
4
A
回答
4
您應該始終在CreateChildControls中構建您的子控件。這是生命週期中初始化並將其添加到控制樹的適當時間。其中一個原因是,許多時候調用EnsureChildContols方法,然後在必要時調用CreateChildControls。最佳實踐,就這樣做。
2
CreateChildControls方法被稱爲每當ASP.NET頁面框架需要創建控件樹,此方法調用不限於特定階段在控制的生命週期。例如,可以在加載頁面時,數據綁定期間或在渲染期間調用CreateChildControls。
0
性能方面,等待創建子控件將爲您的服務器節省一些不必要的CPU時間。例如,如果引發異常或在調用CreateChildControls()之前中斷了線程,則保存創建這些控件所需的時鐘週期。
有什麼理由說在OnInit中創建控件比在CreateChildControls()中更有效?
0
您將在Init或Load中創建控件,直到您編寫需要重新創建控件的控件爲止。
我發現最好是在CreateChildControls中創建控件,然後使用EnsureChildControls來控制確保在需要時創建它們。這使您可以通過將ChildControlsCreated設置爲false來拆除控件,並在需要時再次重新創建它們。
相關問題
- 1. 當我必須使用@section腳本?
- 2. 我必須使用BreezeController嗎?
- 3. 我必須使用循環
- 4. 當我必須阻止我的演員?
- 5. 每次我用$ _我必須使用@
- 6. 當我必須使用__block時,ARC會告訴我嗎?
- 7. 的CreateChildControls兩次
- 8. 我是否必須在ASP.NET中使用Viewstate
- 9. 當我必須做setNeedDisplay或setNeedLayout?
- 10. 當我有svn @ sourceforge時,是否必須使用maven倉庫?
- 11. 當我們必須在C#.Net中使用DBNull.Value,null和「」時,
- 12. 當我必須使用最後的聲明
- 13. asp.net的DataReader,必須關閉
- 14. ASP.NET C#必須聲明
- 15. 收件人必須從ASP.Net
- 16. 使用光標我必須更新表
- 17. epoll:我必須使用多線程
- 18. 我必須使用Flash Media Encoder嗎?
- 19. 爲什麼我必須使用-lstdC++ fs?
- 20. 我必須使用django註冊嗎?
- 21. 我必須使用wsgi_module的「def application」嗎?
- 22. 我必須使用ContinueWith和HttpClient嗎?
- 23. 我必須使用什麼trustlevel?
- 24. 我必須使用OpenAl for ogg文件
- 25. 我是否必須使用onPause/onStart/onDestroy
- 26. 我必須使用按鈕嗎?
- 27. 爲什麼我必須使用this.canvas?
- 28. 爲什麼我必須使用Sobel Operator?
- 29. Zend_Db_Table_Row:爲什麼我必須使用createRow()?
- 30. 我必須使用連接表嗎? [MYSQL]
不,我說的是使用CreateChildControls更高效,因爲可能避免不必要的工作。然而,有時候需要等一等,比如說base.OnLoad,因爲它會得到一些數據,這些數據將決定你應該如何創建這些孩子。在這種情況下,由於您不知道何時會調用EnsureChildControls,因此無法將子級創建延遲至OnLoad之後。它工作,如果我只是在OnLoad中創建一切... – Xerion 2009-10-01 23:46:37
@ Xerion:足夠公平。我不知道爲什麼你的CreateChildControls無法獲取數據,但我確定有一些設計理由。 – JustLoren 2009-10-02 12:53:29
如果這是最好的論據,那是多麼愚蠢的「優化」。誰在乎,如果請求需要150ms而不是149.5ms,如果它導致400/500 *這應該是罕見的*? – 2012-08-06 02:19:22