2011-09-19 73 views
0

在我的網頁上我加載了一個usercontrol的多個實例,有時候usercontrol是自身內部的。我需要爲帖子的往返行程保存一堆屬性,但我很困惑如何將這些屬性保存到ViewState並將它們再次設置爲usercontrol中的repeater項。關於使用ViewState和動態添加的用戶控件感到困惑

誰能幫助我在這種情況下,我已經閱讀視圖狀態的MSDN,但我不理解它很好出於某種原因

這是我如何加載父用戶控件(子控件加載相同使用相同的用戶控制的方式)

Protected Sub Load_Controls(ByVal list As List(Of BSEvaluationGroup.category), ByVal gid As Integer, ByVal pid As Integer, ByVal fid As Integer) 
    Dim item As BSEvaluationGroup.category 
    For Each item In list 
     Dim ctl As PerformanceEvaluationSubcontractorControl = CType(Page.LoadControl("PerformanceEvaluationSubcontractorControl.ascx"), PerformanceEvaluationSubcontractorControl) 
     ctl.categoryid = item.catid 
     ctl.categoryname = item.catname 
     ctl.projectid = pid 
     ctl.folderid = fid 
     ctl.groupid = gid 
     ctl.parentid = item.parid 
     ctl.clist = item.categories 
     ctl.plist = item.points 
     ctl.parentpage = Me 
     ctl.EnableViewState = "true" 
     If (Not subcon Is Nothing AndAlso Not subcon.points Is Nothing) Then 
      ctl.epnts = subcon.points 
     End If 
     AddHandler ctl.BubbleCalculate, AddressOf Me.PostRating 

     Select Case gid 
      Case 1 
       Me.officephld.Controls.Add(ctl) 
       Dim ohrule As HtmlGenericControl = New HtmlGenericControl("hr") 
       ohrule.Style.Add("width", "100%") 
       ohrule.Style.Add("background-color", "Silver") 
       ohrule.Style.Add("size", "1px") 
       ohrule.Style.Add("border-width", "0") 
       ohrule.Style.Add("padding-top", "1px") 
       ohrule.Style.Add("float", "left") 
       Me.officephld.Controls.Add(ohrule) 
      Case 2 
       Me.sitephld.Controls.Add(ctl) 
       Dim shrule As HtmlGenericControl = New HtmlGenericControl("hr") 
       shrule.Style.Add("width", "100%") 
       shrule.Style.Add("background-color", "Silver") 
       shrule.Style.Add("size", "1px") 
       shrule.Style.Add("border-width", "0") 
       shrule.Style.Add("padding-top", "1px") 
       shrule.Style.Add("float", "left") 
       Me.sitephld.Controls.Add(shrule) 
     End Select 
    Next 
End Sub 
+0

向我們展示瞭如何動態地創建你的用戶控件。你不能添加這些屬性作爲你的UserControl中的服務器控件(f.e.TextBox)。這樣這些屬性將自動存儲在ViewState中。否則,你只需手動添加它們:'ViewState(「MyProperty1」)= value' –

+0

我添加了代碼來加載控件。 「ctl.epnts = subcon.points」用於中繼器中加載的AjaxControlToolKit分級控件。 – mattgcon

+0

...你在哪裏調用'Load_Controls'?請記住,即使使用與之前相同的ID進行回發,您也必須重新加載它們。 –

回答

0

這是一個控件ID的問題,我刪除了它,而不是增加一個ID

0

訪問視圖狀態是簡單如ViewState("PropertyName")。 View State包特定於控件實例,因此您可以在多個控件類型和實例中使用相同的屬性名稱。

這裏唯一重要的事情是,ASp.NET運行時必須匹配視圖狀態包以控制實例,並且它使用ID屬性(在父命名容器中是唯一的)。因此,爲您的動態用戶控件實例分配唯一的ID非常重要(並且在回發時維護相同的控制樹層次結構和ID - 實質上這意味着在回發時執行相同的代碼並且不使用隨機ID)。所以,你的代碼應該是這樣

... 
Dim n As Integer 
n = 1 
For Each item In list 
     Dim ctl As PerformanceEvaluationSubcontractorControl = CType(Page.LoadControl("PerformanceEvaluationSubcontractorControl.ascx"), PerformanceEvaluationSubcontractorControl) 
     ctl.ID = "MyCtl" & n.ToString() 
     ctl.categoryid = item.catid 
.... 
+0

我試圖設置每個用戶控制到一個唯一的ID(ctl.ID = item.groupid&item.catid),但在回發時,Viewstate中沒有任何內容 – mattgcon

+0

10以下方法用於改變轉發器內的分級控制值Protected Sub pntrating_Changed BYVAL發件人爲對象,BYVALË作爲AjaxControlToolkit.RatingEventArgs) 昏暗CTL作爲AjaxControlToolkit.Rating = CTYPE(發件人,AjaxControlToolkit.Rating) 視圖狀態(ctl.ClientID)= ctl.ClientID e.CallbackResult = e.Value 結束子 – mattgcon

+0

@mattgcon,確保ID存在於整個控制樹heirachy ie中用戶控件的父級具有ID等。除此之外,您將用戶控件添加到頁面/父級的哪個位置 - 「Load_Controls」沒有任何此類代碼。無論如何,在將控制權添加到頁面之前,應該分配ID。 – VinayC