GridViewでページングした時の行内の値の取得 - その2 -

昨日に引き続き、試行錯誤2日目。
こんな処理を考えてみた。
ページング前のGridView内チェックボックスの状態をセッションに保存。
Page呼び出し時にセッションに保存した状態を復旧する。

「ViewStateでいいじゃん!」と思うかもしれないけれど、気にしない。セッションに値が欲しいのだ。
そしてViewState = Trueでも、値の変更が保存されない。ページングのリンククリックだとポストバックが発生しないから・・・?


2008/1/10 追記

ViewStateは、あくまでViewの保持。今表示しているコントロールの表示を保持する。
ページングで表示コントロールが変わった場合は、表示を保持し続けることはできない。

''' VB.NET '''

Private Dictionary1 As New Dictionary(Of String, Boolean)

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    ' セッション有無のチェック
    If Not Session("Dictionary1") Is Nothing Then
        Dictionary1 = Session("Dictionary1")
    End If

    ' 前ページの状態を保存
    For Each row As GridViewRow In Me.GridView1.Rows
        Dictionary1(row.Cells(1).Text) = CType(row.FindControl("Checkbox1"), CheckBox).Checked
    Next
    Session("Dictionary1") = Dictionary1
End Sub

Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
    ' 表示を更新
    GridView1.DataBind()
    For Each row As GridViewRow In Me.GridView1.Rows
        ' 初めてページを開いた場合、Dictionary項目を追加する
        If Dictionary1.ContainsKey(row.Cells(1).Text) = False Then
            Dictionary1.Add(row.Cells(1).Text, CType(row.FindControl("Checkbox1"), CheckBox).Checked)
        End If
        ' 新ページに状態を復元する
        CType(row.FindControl("Checkbox1"), CheckBox).Checked = Dictionary1(row.Cells(1).Text)
    Next
End Sub

これで、セッションに変更後の値が入る。DBへ登録する配列を作成する時はセッションを参照すればよい・・・はず!

ただ、GridViewひとつにつき、この処理を追加していくのは萎える・・・もっといい方法ないかなぁ。
サンプルで力尽きたので、実装はまた明日。