0

私のWebページでは、ユーザーコントロールの複数のインスタンスをロードしています。ユーザーコントロールがそれ自体にロードされている場合があります。ポストバックの往復のために一連のプロパティを保存する必要がありますが、それらのプロパティを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

これはコントロール ID の問題でした。ID を追加する代わりに削除しました

于 2011-09-23T16:22:19.583 に答える
0

ビューステートへのアクセスは、 のように簡単ViewState("PropertyName")です。ビュー ステート バッグはコントロール インスタンスに固有であるため、複数のコントロール タイプおよびインスタンス内で同じプロパティ名を使用できます。

ここで重要なことは、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 に答える