0

在我的网页上,我正在加载用户控件的多个实例,有时用户控件本身会被加载。我需要为回发的往返保存一堆属性,但我对如何将这些属性保存到 ViewState 并将它们再次设置到用户控件中的转发器项目感到困惑。

任何人都可以在这种情况下帮助我,我已经阅读了 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
4

2 回答 2

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
....
于 2011-09-19T10:52:31.837 回答
0

这是一个控制 ID 问题,我删除了它而不是添加一个 ID

于 2011-09-23T16:22:19.583 回答