- PR -

DatatableとSessionについて

1
投稿者投稿内容
makoto
会議室デビュー日: 2008/04/08
投稿数: 3
投稿日時: 2008-04-08 21:16
Gridviewを配置して、以下のようにDatatableからBindするようにします。
最初はSessionに保存して、2回目以降はSessionに保存しないようにすると
10,10,10・・・ となりそうですが、10,15,20・・・となります。
これは何かの設定に問題があるのでしょうか。

Protected Sub form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles form1.Load
Dim tb As New DataTable
Dim dr As DataRow

If Not Page.IsPostBack Then
If Session("x") Is Nothing Then
tb.Columns.Add("x", Type.GetType("System.Int32"))
dr = tb.NewRow()
dr("x") = 10
tb.Rows.Add(dr)
Session("x") = tb
Else
tb = Session("x")
tb.Rows(0)("x") = tb.Rows(0)("x") + 5
End If
End If
GridView1.DataSource = Session("x")
GridView1.DataBind()
End Sub
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2008-04-08 21:57
引用:
tb = Session("x")
tb.Rows(0)("x") = tb.Rows(0)("x") + 5

tbとSession("x")は同じインスタンスを参照してますよね。その内容を変えた、ということじゃないですかね。
makoto
会議室デビュー日: 2008/04/08
投稿数: 3
投稿日時: 2008-04-09 05:06
すみません。あまり良くわかってないのかもしれませんが、
"x" を"y"に変えても同じ結果になってしまいます。

Protected Sub form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles form1.Load
Dim tb As New DataTable
Dim dr As DataRow

If Not Page.IsPostBack Then
If Session("x") Is Nothing Then
tb.Columns.Add("y", Type.GetType("System.Int32"))
dr = tb.NewRow()
dr("y") = 10
tb.Rows.Add(dr)
Session("x") = tb
Else
tb = Session("x")
tb.Rows(0)("y") = tb.Rows(0)("y") + 5
End If
End If
GridView1.DataSource = Session("x")
GridView1.DataBind()
End Sub
indigo-x
大ベテラン
会議室デビュー日: 2008/02/21
投稿数: 207
お住まい・勤務地: 太陽の塔近く
投稿日時: 2008-04-09 08:02
べるさんが書かれている通りで、同じものを参照してます。
(DataTableの参照について注目すればわかるのでは。。)
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2008-04-09 09:00
元々
Session("x")
のxと
tb.Rows(0)("x")
のxは関係ないので、yに変えても同じことです。

tb = Session("x")
ここでイコールの関係にしてますよね。だから
tb.Rows(0)("y") = tb.Rows(0)("y") + 5
この代入は
Session("x").Rows(0)("y") = tb.Rows(0)("y") + 5
と同じことです。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-04-09 21:46
引用:

makotoさんの書き込み (2008-04-08 21:16) より:
Gridviewを配置して、以下のようにDatatableからBindするようにします。
最初はSessionに保存して、2回目以降はSessionに保存しないようにすると
10,10,10・・・ となりそうですが、10,15,20・・・となります。
これは何かの設定に問題があるのでしょうか。
コード:
Protected Sub form1_Load(ByVal sender As Object _
, ByVal e As System.EventArgs) Handles form1.Load
Dim tb As New DataTable
Dim dr As DataRow

  If Not Page.IsPostBack Then
    ' ポストバックでなければここを通る
    If Session("x") Is Nothing Then
      ' 1回目のリクエストでは、ここを通る
      tb.Columns.Add("x", Type.GetType("System.Int32"))
        dr = tb.NewRow()
        dr("x") = 10
        tb.Rows.Add(dr)
        Session("x") = tb
     Else
        ' 2回目以降のリクエストは、ここを通る
        tb = Session("x")
        tb.Rows(0)("x") = tb.Rows(0)("x") + 5
     End If
    End If
GridView1.DataSource = Session("x")
GridView1.DataBind()
End Sub




というわけで、POST せずに GET すれば、どんどん加算されます。
makoto
会議室デビュー日: 2008/04/08
投稿数: 3
投稿日時: 2008-04-11 05:16
皆様ありがとうございます。
参照型変数という基本的なところが解ってなかったようです。
甘えついでに追加の質問です。
もともと、1回目のリクエストをSessionに退避、2回目以降をdatatabelで加工して(例えば、小計の表示など)GridViewに表示、Sessionに退避した情報(小計が無い情報)は別で使用、ということがやりたかったのです。
このような場合、どうするのが最善策でしょうか。
1

スキルアップ/キャリアアップ(JOB@IT)