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