teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

ソースと条件をもう少し詳細に記述

2017/12/27 09:11

投稿

meesa
meesa

スコア12

title CHANGED
File without changes
body CHANGED
@@ -1,46 +1,109 @@
1
1
  ###前提・実現したいこと
2
+ ASP.NETでWEBアプリケーションを開発しています。
3
+ 画面上に表を配置し、DBから取得した値を表示させようとしています。
4
+ セルには、DBから取得した値(数値0~9)や、「申請種類」という条件に応じて、
2
- DBら取得した値を元に表を生成し値に応じてチェックボックスを表示たいです。
5
+ 文字列か、チェックボックスを表示させたいです。
6
+
7
+ こういった場合に、なるべく可読性の高い、シンプルなソースで実現するための手法として、
8
+ どのような方法が考えられるか、教えていただきたいです。
9
+
10
+ 自分で考えた方法は、
11
+
12
+ 0. GridViewを使用して表を生成
13
+ 0. チェックボックスを表示する可能性があるセルについては、TemplateFieldにし、
14
+ ラベルとチェックボックスを配置
15
+ 0. RowDataBoundイベントで、ラベルとチェックボックスの表示非表示に切り替えを行う
16
+
17
+ というものです。
18
+
3
19
  表示したい表のイメージは以下になります。
4
20
  表示行数の想定は最大でも10行程度で、実際には2~5行がほとんどです。
5
21
 
22
+ ・DBの値
23
+ |管理No.|ユーザー名|申請項目1|申請項目2|申請項目3|
24
+ |:--:|:--:|:--:|:--:|
25
+ |001|ユーザー1|1|0|1|
26
+ |001|ユーザー2|2|1|3|
27
+ |001|ユーザー3|1|2|2|
28
+ |002|ユーザー4|0|8|8|
29
+
30
+ ・画面表示結果(管理No単位で画面表示)
31
+ 管理No.:001
32
+ 申請種類:申請1
6
33
  |ユーザー名|申請項目1|申請項目2|申請項目3|
7
- |:--:|:--:|:--:|
34
+ |:--:|:--:|:--:|:--:|
8
35
  |ユーザー1|□|申請不可|□|
9
36
  |ユーザー2|■|□|申請済|
10
37
  |ユーザー3|□|■|■|
11
38
 
12
39
  ※黒い四角はチェック済みのチェックボックスだと思ってください。
13
40
 
14
- チェックボックスの表示は、以下条件があります。
41
+ 申請種類とDB値の組み合わせ、その表示結果は、項目1場合、
42
+ 申請1かつ0:申請不可
43
+ 申請2かつ0:チェックボックス(OFF)
44
+ 申請1かつ1:チェックボックス(OFF)
45
+ 申請2かつ1:申請対象外
46
+ 申請1かつ2:チェックボックス(ON)
47
+ 申請2かつ2:申請1申請中
15
48
 
49
+ 項目2の場合、
50
+ 申請1かつ0:申請不可
16
- 申請可能な項目に、チェックボックスを表示する。
51
+ 申請2かつ0:チェックボックス(OFF)
52
+ 申請1かつ1:チェックボックス(OFF)
17
-  (申請不可な項目には、申請不可と文字を表示したい
53
+ 申請2かつ1:申請対象外(理由A
54
+ 申請1かつ2:チェックボックス(OFF)
55
+ 申請2かつ2:申請対象外(理由B)
56
+ 申請1かつ3:チェックボックス(ON)
57
+ 申請2かつ3:申請1申請中
18
58
 
19
- ・申請内容が既登録されており再編集で表示することがある。
59
+ ・・・のように、項目ごに、DB同じ値でっても意味が異な場合があります
60
+ また、DBの値7~9は、申請2の場合にチェックボックスを表示し、申請1では文字列を表示する
20
-  もし保存されていた情報、チェック済みだった場合
61
+ ために使用されています。(下記ソースでは省略しています)
21
-  初期値をチェック済み状態で表示する。
22
62
 
23
63
  ###該当のソースコード
24
- ```VB
64
+ ```lang-vb
25
65
  Private Sub GV_User_RowDataBound(sender As Object, e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles GV_User.RowDataBound
26
66
 
27
67
  If e.Row.RowType = DataControlRowType.DataRow Then
28
- Select Case e.Row.Cells(6).Text
68
+ Select Case e.Row.Cells(2).Text
29
69
  Case "0"
70
+           If DemType = 1 then
30
- 'チェックボックスを表示せず、申請不可の文字を表示
71
+ '申請種類1の場合、チェックボックスを表示せず、申請不可の文字を表示
31
72
  e.Row.FindControl("lbl1").Visible = True
32
73
  CType(e.Row.FindControl("lbl1"), Label).Text = "申請不可"
33
74
  e.Row.FindControl("ckb1").Visible = False
75
+ Else
76
+ '申請1ではない場合、チェックボックス(オフ)を表示
77
+ e.Row.FindControl("lbl1").Visible = False
78
+ e.Row.FindControl("ckb1").Visible = True
79
+ CType(e.Row.FindControl("ckb1"),CheckBox).Checked = False
80
+ End If
34
81
  Case "1"
82
+           If DemType = 1 then
35
83
  'チェックボックス(オフ)を表示
36
84
  e.Row.FindControl("lbl1").Visible = False
37
85
  e.Row.FindControl("ckb1").Visible = True
38
86
  CType(e.Row.FindControl("ckb1"),CheckBox).Checked = False
87
+ Else
88
+ '申請1ではない場合、チェックボックスを表示せず、申請対象外の文字を表示
89
+ e.Row.FindControl("lbl1").Visible = True
90
+ CType(e.Row.FindControl("lbl1"), Label).Text = "申請対象外"
91
+ e.Row.FindControl("ckb1").Visible = False
92
+ End If
39
93
  Case "2"
94
+           If DemType = 1 then
40
- 'チェックボックス(オン)を表示
95
+ '申請種類1の場合、チェックボックス(オン)を表示
41
96
  e.Row.FindControl("lbl1").Visible = False
42
97
  e.Row.FindControl("ckb1").Visible = True
43
98
  CType(e.Row.FindControl("ckb1"),CheckBox).Checked = True
99
+ Else
100
+ '申請1ではない場合、チェックボックスを表示せず、申請1申請中の文字を表示
101
+ e.Row.FindControl("lbl1").Visible = True
102
+ CType(e.Row.FindControl("lbl1"), Label).Text = "申請1申請中"
103
+ e.Row.FindControl("ckb1").Visible = False
104
+ End If
105
+
106
+          '以下略(値7~9の場合の場合の分岐処理)
44
107
  End Select
45
108
 
46
109
  '以下略(申請項目数分繰り返し)
@@ -49,15 +112,11 @@
49
112
  ```
50
113
 
51
114
  ###試したこと
52
- 上記ソースの通り、GridViewを使用し、RowDataBoundイベントで、
115
+ 上記ソースGridViewRowDataBound処理の容になります。
53
- TemplateFieldに対してセルの中身を変更する処理を書いています。
54
- TemplateFiledには、あらかじめラベルとチェックボックスを配置し、
55
- 上記ソースれぞれ表示/非表示チェックのオン/オフをしています
116
+ (実ソースそのままは出すこが出来ないため、簡略化しています
117
+ 一応、このソースで目的の動作をすることは確認できているのですが、うまく共通化や簡略化が
118
+ 出来ず、RowDataBoundイベントが大変長くなってしまっています。(350行ほど)
56
119
 
57
- 一応、このソースで目的の動作をすることは確認できているのですが、
58
- RowDataBoundイベントが大変長くなってしまっています。(350行ほど)
59
-
60
- 実際のソースはSelect CaseのCaseが約10パターンあります。
61
120
  また、上記表の列「申請項目」に該当するものが、全部で6列あります。
62
121
  項目ごと分岐数や表示文字列が異なったりするため、共通関数にうまく落とし込めません。
63
122
  そもそも、チェックボックスやラベルの表示/非表示を切り替える、という

2

Select分岐について表記を修正

2017/12/27 09:10

投稿

meesa
meesa

スコア12

title CHANGED
File without changes
body CHANGED
@@ -6,7 +6,7 @@
6
6
  |ユーザー名|申請項目1|申請項目2|申請項目3|
7
7
  |:--:|:--:|:--:|
8
8
  |ユーザー1|□|申請不可|□|
9
- |ユーザー2|■|□|申請不可|
9
+ |ユーザー2|■|□|申請|
10
10
  |ユーザー3|□|■|■|
11
11
 
12
12
  ※黒い四角はチェック済みのチェックボックスだと思ってください。
@@ -43,7 +43,7 @@
43
43
  CType(e.Row.FindControl("ckb1"),CheckBox).Checked = True
44
44
  End Select
45
45
 
46
- '以下略(項目数分繰り返し)
46
+ '以下略(申請項目数分繰り返し)
47
47
  End If
48
48
  End Sub
49
49
  ```
@@ -52,13 +52,17 @@
52
52
  上記ソースの通り、GridViewを使用し、RowDataBoundイベント内で、
53
53
  TemplateFieldに対してセルの中身を変更する処理を書いています。
54
54
  TemplateFiledには、あらかじめラベルとチェックボックスを配置し、
55
- 上記ソースでそれぞれの表示/非表示と表示切り替えをしています。
55
+ 上記ソースでそれぞれの表示/非表示とチェックオン/オフをしています。
56
56
 
57
57
  一応、このソースで目的の動作をすることは確認できているのですが、
58
- 実際のソースはSelect分岐が約10個あり、それがもう5項目分あります。
59
- 項目ごと分岐数や表示文字列が異なったりするため、共通関数にうまく落とし込めない結果、
60
- RowDataBoundイベントが大変長くなってしまっています。。。
58
+ RowDataBoundイベントが大変長くなってしまっています。(350行ほど)
61
59
 
60
+ 実際のソースはSelect CaseのCaseが約10パターンあります。
61
+ また、上記表の列「申請項目」に該当するものが、全部で6列あります。
62
+ 項目ごと分岐数や表示文字列が異なったりするため、共通関数にうまく落とし込めません。
63
+ そもそも、チェックボックスやラベルの表示/非表示を切り替える、という
64
+ やり方が、一般的なのかどうかもわかりません。
65
+
62
66
  もっとスマートな書き方や、一般的にはこうするんじゃない?という情報があれば、
63
67
  教えていただきたいです。
64
68
 

1

誤記修正(DataGridViewではなく、GridViewでした)

2017/12/26 12:19

投稿

meesa
meesa

スコア12

title CHANGED
File without changes
body CHANGED
@@ -49,7 +49,7 @@
49
49
  ```
50
50
 
51
51
  ###試したこと
52
- 上記ソースの通り、DataGridViewを使用し、RowDataBoundイベント内で、
52
+ 上記ソースの通り、GridViewを使用し、RowDataBoundイベント内で、
53
53
  TemplateFieldに対してセルの中身を変更する処理を書いています。
54
54
  TemplateFiledには、あらかじめラベルとチェックボックスを配置し、
55
55
  上記ソースでそれぞれの表示/非表示と表示の切り替えをしています。
@@ -62,7 +62,7 @@
62
62
  もっとスマートな書き方や、一般的にはこうするんじゃない?という情報があれば、
63
63
  教えていただきたいです。
64
64
 
65
- DataGridViewにもこだわりませんので、ご意見やアイディア、ヒントを伺えれば助かります。
65
+ GridViewにもこだわりませんので、ご意見やアイディア、ヒントを伺えれば助かります。
66
66
 
67
67
  ###補足情報(言語/FW/ツール等のバージョンなど)
68
68
  asp.net(VB)