Смущен использованием ViewState с динамически добавленным контролем пользователя - PullRequest
0 голосов
/ 19 сентября 2011

На моей веб-странице я загружаю несколько экземпляров пользовательского контроля, иногда пользовательский контроль загружается внутри самого себя. Мне нужно сохранить кучу свойств для обратной отправки, но я не понимаю, как сохранить эти свойства в ViewState и снова установить их для элементов повторителя в пользовательском контроле.

Может ли кто-нибудь помочь мне в этой ситуации, я прочитал MSDN на Viewstate, но почему-то не очень хорошо понимаю его

Вот так я загружаю родительские пользовательские элементы управления (дочерние элементы управления загружаются одинаково с тем же пользовательским элементом управления)

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

Ответы [ 2 ]

0 голосов
/ 23 сентября 2011

Это была проблема с идентификатором элемента управления, я удалил ее вместо добавления идентификатора

0 голосов
/ 19 сентября 2011

Доступ к состоянию просмотра прост, например ViewState("PropertyName"). Сумка View State относится к экземпляру элемента управления, поэтому вы можете использовать одно и то же имя свойства в нескольких типах и экземплярах элемента управления.

Единственно важным здесь является то, что среда выполнения ASp.NET должна сопоставлять пакеты состояния представлений для управления экземплярами и для этого она использует свойство 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
....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...