2010-01-15 66 views
1

我卡住了!我瞭解頁面生命週期以及如何在page_init上添加動態控件,如果我想利用viewstate。另外我知道我應該儘可能避免動態控制。動態控件是根據從自定義樹視圖發送的自定義事件參數創建的對象創建的。問題是我需要viewstate,所以我需要在page_init中創建它們,但我沒有事件參數來創建對象,該對象告訴我要在生命週期的後期添加哪些控件。解決方案...幫助動態添加控件.net

Private Function GetEventArgs() As npTreeViewEventArgs 
    Dim control As Control = Nothing 
    Dim e As npTreeViewEventArgs = Nothing 
    Dim ctrlname As String = Page.Request.Params("__EVENTTARGET") 
    Dim args As String = Request.Params("__EVENTARGUMENT") 
    If ctrlname IsNot Nothing AndAlso ctrlname <> String.Empty Then 
     control = Page.FindControl(ctrlname) 
    End If 
    If TypeOf control Is npTreeView AndAlso Not String.IsNullOrEmpty(args) Then 
     e = New npTreeViewEventArgs(args) 
    End If 
    Return e 
End Function 

我在page_init中使用它來創建我的對象和控件。這對我來說感覺很骯髒。有另一種方法來處理這個問題嗎?

回答

2

這實際上是對此類問題最直接的解決方案。如果您無法在每次回發中將所有控件添加到頁面並使用可見性來控制其外觀,那麼您在那裏做什麼正是我所推薦的。 (和have recommended before。)

當我看到人們訴諸重定向,或者實現他們自己的視圖狀態跟蹤,或者進行極端的動態控制操作來解決這個問題時,我會畏縮。它可能會感覺骯髒,但它比替代品更易於理解和維護。

0

是的。我這樣做的方式是重載動態控件的視圖狀態以將其存儲在父視圖狀態中。還重載動態控件視圖狀態的讀數。然後,您可以在頁面週期的最後階段創建它們。

當然這比這更棘手......但你明白了。 (我會發布代碼示例,但它是以前的工作,現在無法訪問它們。)