質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

Q&A

1回答

4749閲覧

ASP.netのGridViewで各セルにチェックボックスを配置したい

sakuya

総合スコア10

ASP.NET

ASP.NETは動的なWebサイトやWebアプリケーション、そしてWebサービスを構築出来るようにする為、Microsoftによって開発されたウェブアプリケーション開発フレームワークです。

0グッド

0クリップ

投稿2018/09/10 13:05

編集2018/09/16 05:12

前提・実現したいこと

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にバインドした後チェックボックス以外のフィールドは非表示にしています。
かなり無理やりなソースですので、いずれはさらに勉強して綺麗なソースに直したいとは考えています。
今の私の能力ではこれが精一杯でした。
ただ、上記のソースで、各セルにチェックボックスを表示させることはできました。

上記ソースで、どのチェックボックスにチェックが入っているかを取得することは可能なのでしょうか?
正確に言うと、チェックボックスにチェックが入っているセルの右のセルの値が取得できるかがわかりません。

全く分からないまま自分なりに出来る方法で見た目だけはなんとか作成しましたが、チェックボックスの位置を取得する所でかなり困っています。
何とかヒントだけでも教えて頂けるとありがたいです。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/09/10 13:54

勉強してソースを書いてください。話はそれからだという感じです。
len_souko

2018/09/10 16:09

細かいところはわからないので何とも言い難いのですが、多分出来ます。が、まずは調べるなり実際に試すなりしてもらわない事には「代わりにやってくれ、もちろんタダで」と書いているのと同じですので誰も何も回答しないと思います。
len_souko

2018/09/10 16:11

こちらをよく読んで質問してください。サービス提供者のこのサービスの理念や注意書きが気に食わないのなら他のサービスをご利用ください
guest

回答1

0

一例ですがやり方のヒントを書いておきます。これをベースに検討を進めてコードを書いてください。その上で、どうしても分からないところを質問するようにしていただければ、より解決に近いところで話が進められると思います。

1.ASP.netのGridViewで各セルにチェックボックスを配置することが可能なのでしょうか?

DataTable に 1 ~ 31 の DataColumn を作り、その DataType は Boolean 型にする。チェック有り = True、チェック無し = False として DataTable の各セルを設定する。(データソースとなる SQL Server のテーブルの構造によっては、SqlDataAdapter を使って自動的に上記の構造の DataTable を作ることが可能です。それを考えた方が良いかも)

GridView.DataSource プロパティに DataTable を設定し、GridView.DataBind() メソッドを実行する。

できる限り、SqlDataSource または ObjectDataSource などのデーターソースコントロールを利用して SQL Server からデータを取得し、GridView.DataSourceID にデータソースコントロールの ID を設定することを考えてください。

2.表示したいのはステータスだけなのですが、セルクリックもしくはセルに配置したボタンをクリックすることで、セルの情報を取得することは可能でしょうか?

Template を利用してその中に Button コントロールを配置。ボタンをクリックするとポストバックするので、サーバー側の VB.NET のコードで Button.Click イベントにハンドラをアタッチし、そのハンドラで必要な情報を取得して表示する。

投稿2018/09/11 02:32

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sakuya

2018/09/12 12:40

ヒントをいただき、ありがとうございます。 GridView チェックボックスで検索をかけ、いろいろと調べていたのですが、ヒントすら得られない状況でした。 頂いたヒントで検討を進め、コードを書いていきたいと思います。 出来上がったコードは、必ずこちらに掲載いたします。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2018/09/16 07:11

そもそも何をしたいのでしょう? カレンダーを使った予定表みたいなものなら GridView ではなくて Calendar コントロールを使った方が良さそうな気がしますけど。見当違いの方向に進んでませんか?
退会済みユーザー

退会済みユーザー

2018/09/17 04:18 編集

追加の質問、 > 上記ソースで、どのチェックボックスにチェックが入っているかを取得することは可能なのでしょうか? ・・・を考える前に、上の GridView ではなくて Calendar コントロールを使った方が良いのではという疑問に答えていただきたいのですが。やっぱり GridView は止めたという話になるとアレなので。 Calendar にチェックボックスを配置して、どの日付がチェックされたかを取得する例を紹介しておきます。 CheckBox 付き Calendar(その2) http://surferonwww.info/BlogEngine/post/2013/12/12/calendar-with-checkbox-second.aspx
sakuya

2018/09/17 04:09

コメントありがとうございます。 頂いた例で、再考してみます。
退会済みユーザー

退会済みユーザー

2018/09/19 02:23

検討した結果 Calendar コントロールを使う案ではダメという結論になったらその旨連絡ください。その際は、その理由(何故 GridView でなければならないか等)も合わせて連絡ください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問