2011-09-12 37 views
8

相關問題:Get All Web Controls of a Specific Type on a Page何時使用PreRender over PageLoad?

在上面的問題中,我問我如何獲得所有控件,像一個魅力的作品,但東西只是不太合適,所以我想它可能是我。我有下面的代碼,但它不是操縱頁面上的控件,但在我的理論中它應該工作。

List<DropDownList> allControls = new List<DropDownList>(); 
ControlEnhancer.GetControlList<DropDownList>(Page.Controls, allControls); 

foreach (DropDownList childControl in allControls) 
     { 
      foreach (ListItem li in childControl.Items) 
      { 
       li.Attributes.Add("title", li.Text); 
      } 

      childControl.Attributes.Add("onmouseover", "this.title=this.options[this.selectedIndex].title"); 
     } 

那代碼,GetControlList()的代碼,你可以從相關的問題這說明它是如何獲得的所有控件,它只是我的操作得到。我試圖獲得所有dropdownlist listitems併爲它們添加標題,以便我可以提供一個工具提示。

這是一個快速修復IE8和下面的下拉框中的長文本削減。

+0

原始問題獲取控件的列表,這個問題我需要獲取下拉列表控件並像上面通過添加文本屬性一樣操作它們。 – Anicho

+0

更新:似乎問題不在代碼更多的位置,它不會被執行,直到我強制在頁面上回傳問題是不同的altogther將很快發佈答案。 – Anicho

+0

如果它在頁面加載中運行,需要在prerender事件中運行它。 – Anicho

回答

8

Page_Load經常發生得太快; Page_PreRender是頁面的HTML實際呈現給瀏覽器之前的最後時刻,並且在許多情況下是在用戶控件上設置屬性的最佳位置。

這是因爲Web表單(頁)的生命週期期間還有其他的活動頁面(在頁面中包含的用戶控件...)有時刪除/替換/覆蓋真的)這些屬性所以唯一的辦法,你可以得到這些屬性的瀏覽器是一個加上他們在所有其他生命週期事件被解僱和處理,在Page_PreRender.

+2

好的答案我會推薦大家閱讀:http://msdn.microsoft.com/en-us/library/ms178472.aspx更好地理解asp.net頁面生命週期。 – Anicho

+3

「Page_PreRender是頁面HTML實際呈現之前的最後一刻」 - 不是真的,後面有事件'PreRenderComplete'和'SaveStateComplete'。看到我的答案。 – Joe

8

其實,即使PreRender可能會在某些情況下,過早地(例如,在使用DataSourceID的控件的數據綁定期間,可以將DropDownList控件添加到控件樹中)。

還有兩個事件可能更爲恰當:

  • PreRenderComplete。此時,所有控件都已創建並且頁面已準備好進行渲染。

  • SaveStateComplete。在保存視圖狀態和控制狀態後發生。您在此處所做的任何更改都不會持久以查看狀態。

在您的例子(添加客戶機側屬性),我使用SaveStateComplete事件,以避免不必要的視圖狀態膨脹。

+0

感謝您積極提高答案。謝謝。 – Anicho