求各位高人解答困惑:我的画面上有一个gridview
当前画面从session中取得上个画面传的一个类CfmListParam的值
执行了sql检索后进行榜定
之后gridview中可以对内容进行修改
之后点保存按钮后将各条被选中的数据进行更新部分代码如下:
Page_Load中   cfmLstParam = Nothing
   cfmLstParam = New CfmListParam
   cfmLstParam = DirectCast(Session("ConfirmStatus"), CfmListParam)
   ilstCfmLst = Mapper.Instance().QueryForList("ConfirmStatus_SQL-CONFIRM-1", cfmLstParam)
   Me.grdStatusList.DataSource = ilstCfmLst
   Me.grdStatusList.DataBind()  btnSave_Click中For i As Integer = 0 To grdStatusList.Rows.Count - 1
    If DirectCast(grdStatusList.Rows(i).FindControl("grdChkStatus"), CheckBox).Checked Then
        cfmLstParam = Nothing
        cfmLstParam = New CfmListParam
        CfmLstParam = DirectCast(Session("ConfirmStatus"), CfmListParam)
        CfmLstParam.ER1No = DirectCast(grdStatusList.Rows(i).FindControl("grdLblER1No"), Label).Text
        CfmLstParam.ER2No = DirectCast(grdStatusList.Rows(i).FindControl("grdLblER2No"), Label).Text
        CfmLstParam.StatusFlg = DirectCast(grdStatusList.Rows(i).FindControl("grdCbStatus"), DropDownList).SelectedValue
        CfmLstParam.Eng3Flg = DirectCast(grdStatusList.Rows(i).FindControl("grdLblEng3Flg"), Label).Text
        CfmLstParam.EngCode = DirectCast(grdStatusList.Rows(i).FindControl("grdLblEngCode"), Label).Text
        CfmLstParam.RfmPsnlNo = DirectCast(grdStatusList.Rows(i).FindControl("grdLnkRfmPsnlNo"), LinkButton).Text
        CfmLstParam.PMNo = DirectCast(grdStatusList.Rows(i).FindControl("grdLblPMNo"), Label).Text
        Mapper.Instance().Update("ConfirmStatus_SQL-UPDATE-CONFIRM-ERM-1", CfmLstParam)
        If DirectCast(grdStatusList.Rows(i).FindControl("grdHdnPMUpdateFlg"), HiddenField).Value = "1" Then
            Mapper.Instance().Update("ConfirmStatus_SQL-UPDATE-CONFIRM-PMG-1", CfmLstParam)
        End If
        updateNum += 1
    End If
Next
其他不相关的代码均省略现在我的困惑是
当我执行了保存操作后
session中的ConfirmStatus内容同时发生了变化
这是为什么呢?

解决方案 »

  1.   

    自己调试!!session 是引用类型
      

  2.   

    session保存引用类型的时候, 只保存其引用, 
    当这个变量发生变化的时候. session会跟着变化, 和一般的引用类型赋值一样.
      

  3.   

    当你的数据更新之后,你的Me.grdStatusList.DataSource=(他)cfmLstParam  重新绑定了,
    而 cfmLstParam = DirectCast(Session("ConfirmStatus"), CfmListParam)
    session中的ConfirmStatus 是等于cfmLstParam 这个集合的,所内容同时发生了变化。
    说白了,就是刷新之后重新绑定的时候,你有重新给session中的ConfirmStatus赋值了.
      

  4.   

    仅仅从session中取出数据是不会对session进行修改的,你的代码里应该是有修改的地方才会出现变化的
      

  5.   

    或者你可以换一种思考办法.
    请问还有什么更好的建议吗?
    还是说不使用session而使用request方法?
      

  6.   

    request 的话 你要对保存的对象进行序列化然后再反序列化,更繁琐.你说下你要做什么事吧  我看你的代码中,没有用session 中的对象作什么事情
      

  7.   

    如果多读一次数据库可以解决,就多读一次数据库吧, 这样大的数据量尽量不用session保存吧.
      

  8.   

    学习下 session  我一般 我只放 临时数据。看看 大牛的用法。
      

  9.   

    呵呵,其实存取hashtable的方法已经有写过
    只是pm要求用session
    然后就改了要做什么的话
    其实就是无非上个画面的检索条件保持住
    当本画面有更新并且保存后
    页面重新根据上一个页面的检索key来提交一次实现同步更新我也有想过
    不过这个是个内部系统
    所以可能实际传递和保存内容不会太多
      

  10.   

    就是说要页面传值 ,传的还是文本那post 再合适不过了