
前提・実現したいこと
ASP.net(VB)でGridViewを使ったカレンダー形式のチェック表を作成しています。
データはSQLServerより取り込んで、ステータスによりチェックを行ったかどうかを〇・×・-で表示したいと考えています。
その時、各セルにはチェックボックスを配置し、チェックの入ったセルは上部に配置したボタンをクリックすることにより、チェック不要とステータスを一括変換したいと考えています。
また、セルをクリック(各セルに配置したボタンでも良いです)した時に、そのセルの情報(例えば、データを特定できるチェック№など)を表示させたいと考えています。
そこで、お聞きしたいのが、
1.ASP.netのGridViewで各セルにチェックボックスを配置することが可能なのでしょうか?
2.表示したいのはステータスだけなのですが、セルクリックもしくはセルに配置したボタンをクリックすることで、セルの情報を取得することは可能でしょうか?
の2点です。
可能なのであれば方法をご教授頂ければありがたいです。
下に簡単なイメージを添付しましたのでご確認いただきますようお願いいたします。
まだ、実現可能か調査を行っている段階のため、ソースを記載できませんがよろしくお願いいたします。
追記させて頂きます。
SurferOnWwwさんのヒントから下記のコードを作成いたしました。
aspx
1<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Create_Calendar.aspx.vb" Inherits="SimplyCheckTool.Create_Calendar" %> 2 3<!DOCTYPE html> 4 5<html xmlns="http://www.w3.org/1999/xhtml"> 6<head runat="server"> 7<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 8 <title></title> 9</head> 10<body> 11 <form id="form1" runat="server"> 12 <div> 13 <asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True"> 14 <asp:ListItem Value="1">1月</asp:ListItem> 15 <asp:ListItem Value="2">2月</asp:ListItem> 16 <asp:ListItem Value="3">3月</asp:ListItem> 17 <asp:ListItem Value="4">4月</asp:ListItem> 18 <asp:ListItem Value="5">5月</asp:ListItem> 19 <asp:ListItem Value="6">6月</asp:ListItem> 20 <asp:ListItem Value="7">7月</asp:ListItem> 21 <asp:ListItem Value="8">8月</asp:ListItem> 22 <asp:ListItem Value="9">9月</asp:ListItem> 23 <asp:ListItem Value="10">10月</asp:ListItem> 24 <asp:ListItem Value="11">11月</asp:ListItem> 25 <asp:ListItem Value="12">12月</asp:ListItem> 26 </asp:DropDownList> 27 <asp:DropDownList ID="DropDownList2" runat="server"> 28 </asp:DropDownList> 29 <asp:Button ID="btn_planstop" runat="server" Text="PLANSTOP" /> 30 <asp:Button ID="btn_pdf" runat="server" Link="\SimplyCheckTool\Account\CheckSheetDownLoadStart.ashx.vb" Text="PDF" /> 31 </div> 32 <asp:GridView ID="GridView1" runat="server"> 33 </asp:GridView> 34 </form> 35</body> 36</html>
vb
1 '------------------------------------------------------------------' 2 '- ページ起動時処理 -' 3 '------------------------------------------------------------------' 4 Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 5 If Not IsPostBack Then 6 Dim dtNow As DateTime = Now 7 Dim iMonth As Integer = dtNow.Month 8 DropDownList1.SelectedIndex = iMonth - 1 9 End If 10 11 GridView1.DataSource = GetDataTable() 12 GridView1.DataBind() 13 14 '不要なヘッダーを非表示にする 15 For i = 1 To 93 - 31 16 GridView1.HeaderRow.Cells(i + 31).Visible = False 17 Next 18 19 End Sub 20 Public Function GetDataTable() As DataTable 21 22 Dim intMonth As Integer = DropDownList1.SelectedValue '選択した月 23 Dim intYear As Integer = dtToday.Year '今年の西暦 24 Dim stDay As String = intYear & "/" & intMonth & "/1" '対象年月の初日 25 Dim dtDay As Date = Date.Parse(stDay) 26 Dim dtTomm As Date 27 Dim intWeek As DayOfWeek = dtDay.DayOfWeek 28 Dim wktaskname As String = Nothing 29 30 Dtbl = SQLDS.Tables.Add("OutTbl") 31 Dim Col(94) As DataColumn 32 Col(0) = New DataColumn("task_name", Type.GetType("System.String")) ' 33 Col(1) = New DataColumn("CB1", Type.GetType("System.Boolean")) ' 34 Col(2) = New DataColumn("ST1", Type.GetType("System.String")) ' 35 Col(3) = New DataColumn("ID1", Type.GetType("System.String")) ' 36'上記CB1・ST1・ID1を31日分作成しています。 37 38 39 For x = 1 To 93 40 Col(x).DefaultValue = True 41 x = x + 2 42 Next 43 44 Dtbl.Columns.AddRange(Col) 45 46 intWeek = dtDay.DayOfWeek 47 dtTomm = dtDay.AddMonths(1) 48 49 Dim isTable As Boolean = False 50 isTable = False 51 For i As Integer = 0 To SQLDS.Tables.Count - 1 52 If SQLDS.Tables(i).TableName = "tenken_H_tbl" Then 53 isTable = True 54 Exit For 55 End If 56 Next 57 If isTable Then 58 SQLDS.Tables("tenken_H_tbl").Clear() 59 End If 60 'Dim cmd As SqlCommand 61 Dim str As String = "" 62 Dim dtO As DataTable = New DataTable 63 Dim Wide As ssWide = New ssWide() 64 65 str = String.Empty 66 str += String.Format("SELECT * ") + vbCrLf 67 str += String.Format("FROM View_tenken_H_file ") + vbCrLf 68 dtO = Wide.table_Read(str) 69 70 Dtbl.Clear() 71 72 '取得したデータから「装置名&点検名」「ステータス」を取得し設定 73 'For Each HeaderRow In SQLDS.Tables("tenken_H_tbl").Rows 74 For Each HeaderRow In dtO.Rows 75 Dim dDay As DateTime = HeaderRow("実施開始日") 76 Dim iDay As Integer = dDay.Day 77 Select Case iDay 78 Case 2 79 iDay = 4 80 Case 3 81 iDay = 7 82 End Select 83 intWeek = HeaderRow("実施開始日").DayOfWeek 84 If HeaderRow("点検名") = wktaskname Then 85 DtblRow("task_name") = HeaderRow("装置名") & "_" & HeaderRow("点検名") 86 'DtblRow(iDay) = HeaderRow("ステータス名") 87 DtblRow(iDay) = False 88 DtblRow(iDay + 1) = HeaderRow("ステータス名") 89 DtblRow(iDay + 2) = HeaderRow("点検ファイルNo") 90 Else 91 If wktaskname <> Nothing Then 92 Dtbl.Rows.Add(DtblRow) 93 End If 94 DtblRow = Dtbl.NewRow() 95 DtblRow("task_name") = HeaderRow("装置名") & "_" & HeaderRow("点検名") 96 'DtblRow(iDay) = HeaderRow("ステータス名") 97 DtblRow(iDay) = False 98 DtblRow(iDay + 1) = HeaderRow("ステータス名") 99 DtblRow(iDay + 2) = HeaderRow("点検ファイルNo") 100 wktaskname = HeaderRow("点検名") 101 End If 102 Next 103 Dtbl.Rows.Add(DtblRow) 104 105 Dtbl.Columns(0).ColumnName = "点検名" 106 107 Dim stWeek(31) As String 108 Dim lastDay As Integer 109 Select Case intMonth 110 Case 1, 3, 5, 7, 8, 10, 12 111 lastDay = 31 112 Case 2 113 lastDay = 28 114 Case 2, 4, 6, 9, 11 115 lastDay = 30 116 End Select 117 118 Session("Dtbl") = Dtbl 119 Return Dtbl 120 End Function 121 '------------------------------------------------------------------' 122 '- カレンダー調整処理 -' 123 '------------------------------------------------------------------' 124 Protected Sub GridView1_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GridView1.RowDataBound 125 Dim span_length As Integer = 0 126 Dim cnt_loop As Integer = 31 * 3 '合計カラム数 = 31日分 × 1日3項目 127 Dim delete As Integer = 0 128 Dim stStatus As String 129 Dim stStatus2 As String 130 131 Dim tstStr As String 132 Dim result As Boolean 133 134 For idx = 1 To cnt_loop 135 136 If e.Row.RowIndex < 0 Then Return 137 Dim check As CheckBox = CType(e.Row.Cells(idx).Controls(0), CheckBox) 138 check.Enabled = True 139 stStatus = e.Row.Cells(idx).Text 140 stStatus2 = e.Row.Cells(idx + 1).Text 141 'Dim c As Boolean = check.Checked.Equals(e.Row.Cells(idx)) 142 'ステータス名と検査ステータスNoのセルを非表示 143 e.Row.Cells(idx + 1).Visible = False 144 e.Row.Cells(idx + 2).Visible = False 145 'セルを非表示にしてもセルの合計数が減るわけではないので、確認セルを2セル分とばす 146 idx = idx + 2 147 148 '残りのカラム数が次に確認するセル番号より少ない場合は処理を抜ける 149 If cnt_loop < idx + 3 Then 150 GoTo Finish 151 End If 152 153 Next 154Finish: 155 156 For x = 1 To e.Row.Cells.Count - 2 157 'e.Row.Cells(x) = True 158 'x = x + 2 159 Next 160 161 End Sub 162 163 Protected Sub PlanStop(ByVal sender As Object, ByVal e As GridViewRowEventArgs) Handles btn_planstop.Click 164 For idx = 1 To GridView1.Columns.Count 165 Dim check As CheckBox = CType(e.Row.Cells(idx).Controls(0), CheckBox) 166 167 If e.Row.Cells(idx).Text = True Then 168 e.Row.Cells(idx).BackColor = Drawing.Color.Gray 169 Else 170 e.Row.Cells(idx).BackColor = Drawing.Color.Empty 171 End If 172 173 idx = idx + 2 174 Next 175 176 End Sub 177End Class
教えて頂いた、データーソースコントロールを利用して SQL Server からのデータ取得が難しかったため、無理やりチェックボックスを表示しているような状態です。
データテーブルにチェックボックス用のフィールド・チェックが付いている時に取得したいデータフィールド・GridViewに色付けするためのデータフィールドをそれぞれ31日分作成し、GridViewにバインドした後チェックボックス以外のフィールドは非表示にしています。
かなり無理やりなソースですので、いずれはさらに勉強して綺麗なソースに直したいとは考えています。
今の私の能力ではこれが精一杯でした。
ただ、上記のソースで、各セルにチェックボックスを表示させることはできました。
上記ソースで、どのチェックボックスにチェックが入っているかを取得することは可能なのでしょうか?
正確に言うと、チェックボックスにチェックが入っているセルの右のセルの値が取得できるかがわかりません。
全く分からないまま自分なりに出来る方法で見た目だけはなんとか作成しましたが、チェックボックスの位置を取得する所でかなり困っています。
何とかヒントだけでも教えて頂けるとありがたいです。
よろしくお願いいたします。

