- - PR -
[VS2005 ASP.NET VB]GridViewのRowCreatedイベント
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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 ] |
|
投稿日時: 2008-07-03 10:55
行番号を表示する列に、DEL_FLGとバインドしたラベルを追加してそれを非表示にすることで
DEL_FLGの値を取得する事が出来、senderから1行前を描画すると言う方法で解決する事は出来ました ただ、この場合今の仕様ではFooter行がある仕様なのでそれが出来るのですが Footer行が無い仕様になると最終行の描画が出来ないんじゃないかと思われます 後学の為にも、何かアドバイス有りましたら引き続きお願いいたします |
|
投稿日時: 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 ] |
|
投稿日時: 2008-07-03 12:16
RapidExpressさん
ありがとうございます RowDataboundのイベントで行った場合上手く処理を組む事が出来ました! こちらの方法ですと削除フラグをバインドした列を非表示にするだけで、Labelコントロール自体が不要になり、簡略化することが出来ました バウンドした時に行の背景色を変更すると、その後ポストバック時に操作する必要なく、背景色が残ると言う事も始めてきづきました ご指導感謝いたします |
1