2

を使用するユーザー コントロールがありますUpdatePanel。コントロールは基本的に、Button. ユーザーが をクリックするButtonと、値を選択できるモーダル ポップアップが開きます。テーブルのデータ ( をRepeaterとして使用DataSource) は、部分的なポストバック ( が起動したとき) の間のセッション変数にUpdatePanel、オブジェクトのリストとして格納されます。コントロールが 1 つしかない場合はすべて正常に機能しますが、このコントロールを同じページで複数回使用すると、セッション変数内のオブジェクトのリストが結合され、コントロールごとに分離されません。これは、セッション変数名が一意ではないためではないかと考えたので、変数を呼び出したり使用したりする場所はどこでも、次のようにします。

Dim sessionName as string = Me.UniqueID & "_" & "userNotificationDS"
Session(sessionName) = myListOfObjects

しかし、これは結果を変えていません。ここで私が間違っていることを知っている人はいますか?完全なコードが役立つと思われる場合は、お知らせください。

コントロール サーバー コード:

Protected Sub delete_click(ByVal sender As Object, ByVal e As EventArgs)
    Dim btn As LinkButton = CType(sender, LinkButton)
    Dim ds As New List(Of myObject)
    sessionName = Me.UniqueID & "_" & "myDataSet"

    ds = Session(sessionName.ToString)

    Dim id As String = btn.CommandArgument

    ds.RemoveAll(Function(userNotification) userNotification.User.NetworkID.Equals(id))

    Session(sessionName.ToString) = ds


    bindData(ds)
End Sub


Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    sessionName = Me.UniqueID & "_" & "myDataSet"

    If (Session(sessionName.ToString) IsNot Nothing) Then
        bindData(Session(sessionName.ToString))
    End If
End Sub  

 Private Function buildPagedSet(ByVal userNotification As List(Of myObject)) As PagedDataSource
    Dim ps As PagedDataSource = New PagedDataSource()

    ps.DataSource = userNotification
    ps.AllowPaging = True
    ps.PageSize = numRows

    Return ps
End Function

  Public Sub bindData(ByVal commentList As List(Of myObject))
    sessionName = Me.UniqueID & "_" & "myDataSet"
    Dim currentPage As Integer = 0
    Dim ps As PagedDataSource
    Dim numLable As Label
    Dim denomLable As Label
    Dim curPage As Integer = 1
    Dim totalPage As Integer = 0

    If (Not myObject Is Nothing) Then

        Try
            ps = buildPagedSet(commentList)
            totalPage = ps.PageCount
            Session(sessionName.ToString) = commentList 
            rowTotal = ps.Count

            'for paging
            If Not (ViewState(Me.UniqueID & "_Page") Is Nothing) Then
                currentPage = Convert.ToInt32(ViewState(Me.UniqueID & "_Page"))
            Else
                ViewState(Me.UniqueID & "_Page") = 1
                currentPage = 1
            End If

            If (currentPage > 0 And currentPage <= ps.PageCount) Then
                ps.CurrentPageIndex = currentPage - 1
                Me.dataRepeateUsers.DataSource = ps
                Me.dataRepeateUsers.DataBind()

            ElseIf (currentPage >= ps.PageCount) Then
                ViewState(Me.UniqueID & "_Page") = Convert.ToInt32(ViewState(Me.UniqueID & "_Page")) - 1
            ElseIf (currentPage <= 0) Then
                ViewState(Me.UniqueID & "_Page") = Convert.ToInt32(ViewState(Me.UniqueID & "_Page")) + 1
            Else
            End If

        Catch ex As Exception
            Throw
        End Try
    Else
        Dim emptySet As New List(Of myObject)
        Me.dataRepeateUsers.DataSource = emptySet
        Me.dataRepeateUsers.DataBind()
    End If

End Sub

コントロールは次のようにインスタンス化されます。

Me.notifier1.bindData(notificationList)

この例では、ユーザーが notifier1 から何かを削除すると (delete_click イベント)、オブジェクトはリストから削除され、セッションに再び追加されます。なんらかの原因で notifier2 の更新パネルが起動すると、notifier1 とまったく同じデータが表示されます。

4

2 に答える 2

2

私の勘は、あなたがセッションにあなたを保存してmyListOfObjectsいるが、そのオブジェクトをどこかで再利用し、それを変更しSessionて、別のキーで再び保存していることです。おそらく、両方のSessionキーに保存されているのは同じオブジェクトです。

Session2つの異なるキーを使用してオブジェクトをに格納することにより、簡単なテストを実行できます。次に、最初のキーを使用してそれを引き出し、そのオブジェクトを変更し、Session(とにかく必要ない)に再割り当てしないでください。次に、2番目のキーから他のオブジェクトを引き出して、それを確認します。オブジェクトは、の2つの異なるキーの下に格納されているのと同じオブジェクトであるため、変更と一致しますSession

于 2013-02-13T19:08:03.677 に答える
0

Kelsey の推測が正しければ、myListOfObjects の各インスタンスを に格納し、Dictionary(Of String, myListOfObjectsType).UniqueID をキー (Of String 部分) として使用できます。

于 2013-02-13T19:41:25.847 に答える