- PR -

[VS2005 ASP.NET VB]GridViewのRowCreatedイベント

1
投稿者投稿内容
エイジ
常連さん
会議室デビュー日: 2007/11/14
投稿数: 38
お住まい・勤務地: 兵庫
投稿日時: 2008-07-03 10:17
何時もお世話になっております。

開発環境はタイトルに書かせてもらったとおりでOSはWindowsXPのHomeです

ASP.NETでの開発は始めての為無知な部分が多々あるかと思いますが
その点も含めてご指摘いただければ幸いです



まずGridViewにはSqlDataSourceコントロールを使ってバインドしています

列が9列有り、削除フラグの列は非表示
1列目2列目は非バインド列で1列目に行番号、2列目に選択をする為のRadioButtonコントロール
3列目4列目は編集可能にするため、列のスタイルをテンプレートにしてTextBoxコントロールを配置し、それにバインドしています

5〜8列目は編集不可でバインドしたデータのみ表示していると言うのが基本の作りです




上記の基本から、削除フラグの立った行は背景色を変えると言う仕様があります


そのためRowCreatedイベントで下記の処理を実行し灰色にする事はできました

Protected Sub grdHead_RowCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles grdHead.RowCreated
  Try
    '削除行を灰色にする
    If Not IsNothing(e.Row.DataItem) Then
      If CType(e.Row.DataItem, System.Data.DataRowView).Row.Item("DEL_FLG").ToString = "1" Then
        e.Row.BackColor = Drawing.Color.Silver
      End If
    End If

  Catch ex As Exception
  Finally
  End Try
End Sub



そこまでは良かったのですが、RadioButtonの制御の為
RadioButtonのAutoPostBackをTrueにし、RadioButtonのCheckedChangedイベントを拾って
対象行以外のチェックを外すと言う処理を加えています


(上記処理は、GridViewの行毎にはグループ化できるが、列毎にRadioButtonがグループ化できないと言う問題の為必要)



また、上記以外にもButtonでPanelの表示非表示を入れ替えると言う処理があるため
PostBackが発生します




そこで問題になったのがPostBackで再表示する際は
GridViewコントロールのRowCreatedイベントで、e.Row.DataItemがNothingになるため
削除フラグを確認する事ができないという現象です


senderを使用して描画できないかと思い

    If e.Row.RowType = DataControlRowType.Footer Or e.Row.RowType = DataControlRowType.DataRow Then
      If sender.Rows.Count > 0 Then
        If CType(sender.Rows(sender.Rows.Count - 1), GridViewRow).Cells(8).Text = "1" Then
          CType(sender.Rows(sender.Rows.Count - 1), GridViewRow).BackColor = Drawing.Color.Silver
        End If
      End If
    End If


上記処理で、1行前に描画した行を判断する処理を加えました
しかし、CType(sender.Rows(sender.Rows.Count - 1), GridViewRow).Cells(8).Text
ここで削除フラグの列が非表示の為、上手く値を取ってくることが出来ず実現出来ない状態になっています




上記問題を解決するにあたり、PostBackを発生しなくすると言うのは仕様上難しいと思われる為


1.削除列の値をどうにか取得できるようにする
2.PostBack前の列のスタイルをセッションに置いておきそれを、PostBack後反映させる


と言う事くらいしか現状思い浮かばない状態です


何か良い手法があればアドバイスいただければ助かります


以上、よろしくお願いします


-----------------------------
10:19 顔文字が表示されて居たため修正
10:33 誤字があったため修正

[ メッセージ編集済み 編集者: エイジ 編集日時 2008-07-03 10:19 ]

[ メッセージ編集済み 編集者: エイジ 編集日時 2008-07-03 10:33 ]
エイジ
常連さん
会議室デビュー日: 2007/11/14
投稿数: 38
お住まい・勤務地: 兵庫
投稿日時: 2008-07-03 10:55
行番号を表示する列に、DEL_FLGとバインドしたラベルを追加してそれを非表示にすることで

DEL_FLGの値を取得する事が出来、senderから1行前を描画すると言う方法で解決する事は出来ました


ただ、この場合今の仕様ではFooter行がある仕様なのでそれが出来るのですが
Footer行が無い仕様になると最終行の描画が出来ないんじゃないかと思われます



後学の為にも、何かアドバイス有りましたら引き続きお願いいたします
RapidExpress
常連さん
会議室デビュー日: 2007/11/11
投稿数: 42
お住まい・勤務地: おおさか
投稿日時: 2008-07-03 11:33
まず、背景色変更の処理をRowCreatedからRowDataboundに移動させます。
削除フラグを非表示のTemplateFieldで定義すればLabelコントロールが一つできると思うので、
そのIDでe.Row.FindControl("Label")すればその列の値を取れると思います。

[追記]
結構近いケース?
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=43360&forum=7
[/追記]
_________________
//---
 あやのこうじ@RapidExpress

[ メッセージ編集済み 編集者: RapidExpress 編集日時 2008-07-03 11:36 ]
エイジ
常連さん
会議室デビュー日: 2007/11/14
投稿数: 38
お住まい・勤務地: 兵庫
投稿日時: 2008-07-03 12:16
RapidExpressさん

ありがとうございます

RowDataboundのイベントで行った場合上手く処理を組む事が出来ました!
こちらの方法ですと削除フラグをバインドした列を非表示にするだけで、Labelコントロール自体が不要になり、簡略化することが出来ました

バウンドした時に行の背景色を変更すると、その後ポストバック時に操作する必要なく、背景色が残ると言う事も始めてきづきました


ご指導感謝いたします
1

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