###前提・実現したいこと
ASP.NETでWEBアプリケーションを開発しています。
画面上に表を配置し、DBから取得した値を表示させようとしています。
セルには、DBから取得した値(数値0~9)や、「申請種類」という条件に応じて、
文字列か、チェックボックスを表示させたいです。
こういった場合に、なるべく可読性の高い、シンプルなソースで実現するための手法として、
どのような方法が考えられるか、教えていただきたいです。
自分で考えた方法は、
- GridViewを使用して表を生成
- チェックボックスを表示する可能性があるセルについては、TemplateFieldにし、
ラベルとチェックボックスを配置
0. RowDataBoundイベントで、ラベルとチェックボックスの表示非表示に切り替えを行う
というものです。
表示したい表のイメージは以下になります。
表示行数の想定は最大でも10行程度で、実際には2~5行がほとんどです。
・DBの値
|管理No.|ユーザー名|申請項目1|申請項目2|申請項目3|
|:--:|:--:|:--:|:--:|
|001|ユーザー1|1|0|1|
|001|ユーザー2|2|1|3|
|001|ユーザー3|1|2|2|
|002|ユーザー4|0|8|8|
・画面表示結果(管理No単位で画面表示)
管理No.:001
申請種類:申請1
ユーザー名 | 申請項目1 | 申請項目2 | 申請項目3 |
---|---|---|---|
ユーザー1 | □ | 申請不可 | □ |
ユーザー2 | ■ | □ | 申請済 |
ユーザー3 | □ | ■ | ■ |
※黒い四角はチェック済みのチェックボックスだと思ってください。
申請種類とDBの値の組み合わせ、その表示結果は、項目1の場合、
申請1かつ0:申請不可
申請2かつ0:チェックボックス(OFF)
申請1かつ1:チェックボックス(OFF)
申請2かつ1:申請対象外
申請1かつ2:チェックボックス(ON)
申請2かつ2:申請1申請中
項目2の場合、
申請1かつ0:申請不可
申請2かつ0:チェックボックス(OFF)
申請1かつ1:チェックボックス(OFF)
申請2かつ1:申請対象外(理由A)
申請1かつ2:チェックボックス(OFF)
申請2かつ2:申請対象外(理由B)
申請1かつ3:チェックボックス(ON)
申請2かつ3:申請1申請中
・・・のように、項目ごとに、DBが同じ値であっても意味が異なる場合があります。
また、DBの値7~9は、申請2の場合にチェックボックスを表示し、申請1では文字列を表示する
ために使用されています。(下記ソースでは省略しています)
###該当のソースコード
lang
1Private Sub GV_User_RowDataBound(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GV_User.RowDataBound 2 3 If e.Row.RowType = DataControlRowType.DataRow Then 4 Select Case e.Row.Cells(2).Text 5 Case "0" 6 If DemType = 1 then 7 '申請種類1の場合、チェックボックスを表示せず、申請不可の文字を表示 8 e.Row.FindControl("lbl1").Visible = True 9 CType(e.Row.FindControl("lbl1"), Label).Text = "申請不可" 10 e.Row.FindControl("ckb1").Visible = False 11 Else 12 '申請1ではない場合、チェックボックス(オフ)を表示 13 e.Row.FindControl("lbl1").Visible = False 14 e.Row.FindControl("ckb1").Visible = True 15 CType(e.Row.FindControl("ckb1"),CheckBox).Checked = False 16 End If 17 Case "1" 18 If DemType = 1 then 19 'チェックボックス(オフ)を表示 20 e.Row.FindControl("lbl1").Visible = False 21 e.Row.FindControl("ckb1").Visible = True 22 CType(e.Row.FindControl("ckb1"),CheckBox).Checked = False 23 Else 24 '申請1ではない場合、チェックボックスを表示せず、申請対象外の文字を表示 25 e.Row.FindControl("lbl1").Visible = True 26 CType(e.Row.FindControl("lbl1"), Label).Text = "申請対象外" 27 e.Row.FindControl("ckb1").Visible = False 28 End If 29 Case "2" 30 If DemType = 1 then 31 '申請種類1の場合、チェックボックス(オン)を表示 32 e.Row.FindControl("lbl1").Visible = False 33 e.Row.FindControl("ckb1").Visible = True 34 CType(e.Row.FindControl("ckb1"),CheckBox).Checked = True 35 Else 36 '申請1ではない場合、チェックボックスを表示せず、申請1申請中の文字を表示 37 e.Row.FindControl("lbl1").Visible = True 38 CType(e.Row.FindControl("lbl1"), Label).Text = "申請1申請中" 39 e.Row.FindControl("ckb1").Visible = False 40 End If 41 42 '以下略(値7~9の場合の場合の分岐処理) 43 End Select 44 45 '以下略(申請項目数分繰り返し) 46 End If 47 End Sub
###試したこと
上記ソースはGridViewのRowDataBound処理の内容になります。
(実ソースそのままは出すことが出来ないため、簡略化しています)
一応、このソースで目的の動作をすることは確認できているのですが、うまく共通化や簡略化が
出来ず、RowDataBoundイベントが大変長くなってしまっています。(350行ほど)
また、上記表の列「申請項目」に該当するものが、全部で6列あります。
項目ごと分岐数や表示文字列が異なったりするため、共通関数にうまく落とし込めません。
そもそも、チェックボックスやラベルの表示/非表示を切り替える、という
やり方が、一般的なのかどうかもわかりません。
もっとスマートな書き方や、一般的にはこうするんじゃない?という情報があれば、
教えていただきたいです。
GridViewにもこだわりませんので、ご意見やアイディア、ヒントを伺えれば助かります。
###補足情報(言語/FW/ツール等のバージョンなど)
asp.net(VB)
.NetFramework 4.0
Visual Studio 2010
回答2件
あなたの回答
tips
プレビュー