tag:crieit.net,2005:https://crieit.net/tags/DataGridView/feed
「DataGridView」の記事 - Crieit
Crieitでタグ「DataGridView」に投稿された最近の記事
2019-10-03T09:28:32+09:00
https://crieit.net/tags/DataGridView/feed
tag:crieit.net,2005:PublicArticle/15448
2019-10-03T09:28:32+09:00
2019-10-03T09:28:32+09:00
https://crieit.net/posts/VB-NET-DataGridView-5d9540b08ea4f
【VB.NET】DataGridView の行を動的に追加してみる
<p>引き続き、DataGridView関連の話し。<br />
今回は行を動的に追加する方法を試してみてました。</p>
<p>プログラムは前回のものを流用します。<br />
<a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/12/27/post-3564/" target="_blank" rel="noopener noreferrer" data-blogcard="1">【VB.NET】DataGridView を直接変更してデータを更新してみる</a></p>
<h2 id="プログラム修正"><a href="#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E4%BF%AE%E6%AD%A3">プログラム修正</a></h2>
<h3 id="追加処理"><a href="#%E8%BF%BD%E5%8A%A0%E5%87%A6%E7%90%86">追加処理</a></h3>
<p>追加ボタンが押されたタイミングで、データグリッドビューの空行を作成して追加します。</p>
<p>今回は、1行追加したら「更新」するまで追加できないようにしました。<br />
(グローバルでフラグを持たせています)</p>
<pre><code> ''' <summary>
''' 追加ボタンクリックイベント
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub btnAdd_Click(sender As Object, e As EventArgs) Handles btnAdd.Click
' 追加後に更新されていなければ処理しない
If (AddRowFlg) Then
Return
End If
AddRowFlg = True
Using conn As New SQLiteConnection("Data Source=SampleDb.sqlite")
' データベースオープン
conn.Open()
' データ追加
Using con As New DataContext(conn)
Dim idx = dgvCat.Rows.Count()
' 行追加
dgvCat.Rows.Add()
' 種別マスタ取得
Dim kinds As Table(Of Kind) = con.GetTable(Of Kind)
Dim kindResult As IQueryable(Of Kind) = From x In kinds Order By x.KindCd Select x
Dim kindList = kindResult.ToList()
' 猫一覧取得
Dim tblCat As Table(Of Cat) = con.GetTable(Of Cat)
Dim newNo = 0
' 使用できるNoを判定
For i As Integer = 1 To tblCat.ToList().Count() + 1
Dim selectNo = i
If tblCat.SingleOrDefault(Function(x As Cat) x.No = selectNo) Is Nothing Then
newNo = selectNo
End If
Next
' No(プライマリなので編集不可)
Dim no = New DataGridViewTextBoxCell()
no.Value = newNo
dgvCat(0, idx) = no
dgvCat(0, idx).ReadOnly = True
' 名前
Dim name = New DataGridViewTextBoxCell()
dgvCat(1, idx) = name
' 性別
Dim sex = New DataGridViewComboBoxCell()
sex.Items.AddRange({"♂", "♀"})
sex.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox
dgvCat(2, idx) = sex
' 年齢
Dim age = New DataGridViewTextBoxCell()
dgvCat(3, idx) = age
' 種別
Dim kind = New DataGridViewComboBoxCell()
kind.DataSource = kindList
kind.DisplayMember = "KindName"
kind.ValueMember = "KindCd"
kind.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox
dgvCat(4, idx) = kind
' 好物
Dim favorite = New DataGridViewTextBoxCell()
dgvCat(5, idx) = favorite
End Using
conn.Close()
End Using
End Sub
</code></pre>
<h3 id="更新処理"><a href="#%E6%9B%B4%E6%96%B0%E5%87%A6%E7%90%86">更新処理</a></h3>
<p>更新処理では、データグリッドビューから直接値を取得して、データベースに存在しなければ追加、存在すれば更新というようにしました。</p>
<pre><code> ''' <summary>
''' 更新ボタンクリックイベント
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub btnUpdate_Click(sender As Object, e As EventArgs) Handles btnUpdate.Click
Using conn As New SQLiteConnection("Data Source=SampleDb.sqlite")
' データベースオープン
conn.Open()
' データ更新
Using con As New DataContext(conn)
' 対象のテーブルオブジェクトを取得
Dim Table = con.GetTable(Of Cat)
' 選択されているデータを取得
For i = 0 To dgvCat.Rows.Count - 1
' テーブルから対象のデータを取得
Dim no As Integer = dgvCat(0, i).Value
Dim target As Cat = Table.SingleOrDefault(Function(x As Cat) x.No = no)
If (target Is Nothing) Then
' データ作成
Dim Cat As New Cat()
Cat.No = dgvCat(0, i).Value
Cat.Name = dgvCat(1, i).Value
Cat.Sex = dgvCat(2, i).Value
Cat.Age = dgvCat(3, i).Value
Cat.KindCd = dgvCat(4, i).Value
Cat.Favorite = dgvCat(5, i).Value
Table.InsertOnSubmit(Cat)
Else
' データ変更
target.Name = dgvCat(1, i).Value
target.Sex = dgvCat(2, i).Value
target.Age = dgvCat(3, i).Value
target.KindCd = dgvCat(4, i).Value
target.Favorite = dgvCat(5, i).Value
End If
' DBの変更を確定
con.SubmitChanges()
Next
End Using
conn.Close()
End Using
AddRowFlg = False
' データ再検索
search()
MessageBox.Show("データを更新しました。")
End Sub
</code></pre>
<p> </p>
<h2 id="起動してみる"><a href="#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">起動してみる</a></h2>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite5_000.jpg" alt="検索後" /></p>
<p>とりあえず検索します。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite5_001.jpg" alt="追加ボタンクリック" /></p>
<p>追加ボタンをクリックすると空行が追加されます。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite5_002.jpg" alt="データを入力" /></p>
<p>追加された行に値を設定します。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite5_003.jpg" alt="更新ボタンをクリック" /></p>
<p>更新ボタンをクリック、再検索後の画面が表示されます。</p>
<h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2>
<p>年の瀬となり忙しくなってまいりましたが<br />
なんとか更新していきたいと思います。</p>
<p>次回はどうしようかな。。</p>
<p>ではでは。</p>
doraxdora
tag:crieit.net,2005:PublicArticle/15446
2019-10-02T09:28:19+09:00
2019-10-02T09:28:19+09:00
https://crieit.net/posts/VB-NET-DataGridView
【VB.NET】DataGridView を直接変更してデータを更新してみる
<p>今回は、データグリッドビューの内容を直接編集してデータを更新したいと思います。</p>
<p>プログラムは例によって前回のものを。<br />
<a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/12/24/post-3541/" target="_blank" rel="noopener noreferrer" data-blogcard="1">【VB.NET】SQLiteに接続してデータを登録してみる</a></p>
<h2 id="プログラム修正"><a href="#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E4%BF%AE%E6%AD%A3">プログラム修正</a></h2>
<h3 id="検索処理"><a href="#%E6%A4%9C%E7%B4%A2%E5%87%A6%E7%90%86">検索処理</a></h3>
<p>取得したデータを走査して1行ずつ作成していくように変更します。</p>
<pre><code> ''' <summary>
''' 検索処理
''' </summary>
Private Sub search()
Using conn As New SQLiteConnection("Data Source=SampleDb.sqlite")
' データベースオープン
conn.Open()
' 検索条件を指定してデータを取得
Using con As New DataContext(conn)
Dim searchName As String = txtName.Text
Dim searchKind As String = CType(cmbKind.SelectedValue, Kind).KindCd
' 種別マスタ取得
Dim kinds As Table(Of Kind) = con.GetTable(Of Kind)
Dim kindResult As IQueryable(Of Kind) = From x In kinds Order By x.KindCd Select x
Dim kindList = kindResult.ToList()
' 猫一覧取得
Dim tblCat As Table(Of Cat) = con.GetTable(Of Cat)
Dim result As IQueryable(Of Cat)
If (searchKind = "") Then
' 種別が選択されていなければ名前のみ前方一致指定
result = From x In tblCat
Where x.Name.StartsWith(searchName)
Order By x.No
Select x
Else
' 種別が選択されていれば名前+種別で検索
result = From x In tblCat
Where x.Name.StartsWith(searchName) & x.KindCd = searchKind
Order By x.No
Select x
End If
' データグリッドビューに設定
'dgvCat.DataSource = result.ToList()
Dim list As List(Of Cat) = result.ToList()
Dim i As Integer = 0
dgvCat.Rows.Clear()
For i = 0 To list.Count() - 1
Dim cat = list(i)
' 行追加
dgvCat.Rows.Add()
' No(プライマリなので編集不可)
Dim no = New DataGridViewTextBoxCell()
no.Value = cat.No
dgvCat(0, i) = no
dgvCat(0, i).ReadOnly = True
' 名前
Dim name = New DataGridViewTextBoxCell()
name.Value = cat.Name
dgvCat(1, i) = name
' 性別
Dim sex = New DataGridViewComboBoxCell()
sex.Items.AddRange({"♂", "♀"})
sex.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox
dgvCat(2, i) = sex
dgvCat(2, i).Value = cat.Sex
' 年齢
Dim age = New DataGridViewTextBoxCell()
age.Value = cat.Age
dgvCat(3, i) = age
' 種別
Dim kind = New DataGridViewComboBoxCell()
kind.DataSource = kindList
kind.DisplayMember = "KindName"
kind.ValueMember = "KindCd"
kind.DisplayStyle = DataGridViewComboBoxDisplayStyle.ComboBox
dgvCat(4, i) = kind
dgvCat(4, i).Value = cat.KindCd
' 好物
Dim favorite = New DataGridViewTextBoxCell()
favorite.Value = cat.Favorite
dgvCat(5, i) = favorite
Next
End Using
' データベースクローズ
conn.Close()
End Using
End Sub
</code></pre>
<p> </p>
<h3 id="更新処理"><a href="#%E6%9B%B4%E6%96%B0%E5%87%A6%E7%90%86">更新処理</a></h3>
<p>データグリッドビューに表示されているデータを全て更新するように変更します。</p>
<pre><code> ''' <summary>
''' 更新ボタンクリックイベント
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub btnUpdate_Click(sender As Object, e As EventArgs) Handles btnUpdate.Click
Using conn As New SQLiteConnection("Data Source=SampleDb.sqlite")
' データベースオープン
conn.Open()
' データ更新
Using con As New DataContext(conn)
' 対象のテーブルオブジェクトを取得
Dim Table = con.GetTable(Of Cat)
' 選択されているデータを取得
For i = 0 To dgvCat.Rows.Count - 1
' テーブルから対象のデータを取得
Dim no As Integer = dgvCat(0, i).Value
Dim target As Cat = Table.Single(Function(x As Cat) x.No = no)
' データ変更
target.Name = dgvCat(1, i).Value
target.Sex = dgvCat(2, i).Value
target.Age = dgvCat(3, i).Value
target.KindCd = dgvCat(4, i).Value
target.Favorite = dgvCat(5, i).Value
' DBの変更を確定
con.SubmitChanges()
Next
End Using
conn.Close()
End Using
' データ再検索
search()
MessageBox.Show("データを更新しました。")
End Sub
</code></pre>
<h3 id="コンボボックスの制御"><a href="#%E3%82%B3%E3%83%B3%E3%83%9C%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E3%81%AE%E5%88%B6%E5%BE%A1">コンボボックスの制御</a></h3>
<p>以前の記事でもやりましたが、<br />
コンボボックスがワンクリックで開くように仕込みを入れます。</p>
<pre><code> ''' <summary>
''' データグリッドビューセルクリックイベント
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub dgvCat_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgvCat.CellClick
Dim dgv As DataGridView = CType(sender, DataGridView)
gridComboHandle(dgv, e)
End Sub
''' <summary>
''' データグリッドビューのコンボボックス制御
''' </summary>
''' <param name="dgv"></param>
''' <param name="e"></param>
Private Sub gridComboHandle(dgv As DataGridView, e As DataGridViewCellEventArgs)
' 対象の列だった場合
If dgv.Columns(e.ColumnIndex).Name = "ColSex" Or dgv.Columns(e.ColumnIndex).Name = "ColKind" Then
SendKeys.SendWait("{F4}")
End If
End Sub
</code></pre>
<h2 id="起動してみる"><a href="#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">起動してみる</a></h2>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite4_000.jpg" alt="データ検索後" /></p>
<p>データ検索後の画面。<br />
無事にデータが表示され、データグリッドビューにコンボボックスも表示されています。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite4_001.jpg" alt="データ変更" /></p>
<p>1行目の種別を変更して、「更新」ボタンをクリックします。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbSQLite4_002.jpg" alt="データ変更後" /></p>
<p>無事に変更できました。</p>
<h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2>
<p>やり方としてはいまいちで、WPFみたいにMVVMとかバインディングとかできるかと思いますが、これはこれでもしかしたら需要があるかもしれません。</p>
<p>次回は追加処理をしてみます。</p>
<p>ではでは。</p>
doraxdora
tag:crieit.net,2005:PublicArticle/15411
2019-09-20T09:23:00+09:00
2019-09-20T09:23:00+09:00
https://crieit.net/posts/VB-NET-5d841be41e23c
【VB.NET】データグリッドビューでチェックされた行の背景色を変更する
<p>引き続きVB.NETの話し。<br />
せっかくチェックボックスにイベントを仕込んだのでそれをトリガーにして背景色を変更する処理を実装したいと思います。</p>
<p>プログラムは下記のものを流用します。<br />
<a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/12/19/post-3494/" target="_blank" rel="noopener noreferrer" data-blogcard="1">【VB.NET】データグリッドビューで行毎のチェックボックスにイベントを仕込む</a>## プログラムの修正</p>
<h3 id="背景色の定義を追加"><a href="#%E8%83%8C%E6%99%AF%E8%89%B2%E3%81%AE%E5%AE%9A%E7%BE%A9%E3%82%92%E8%BF%BD%E5%8A%A0">背景色の定義を追加</a></h3>
<p>グローバルの定数として背景色を定義します。</p>
<p>Form1.vb</p>
<pre><code> ' 通常時の背景色
Private Const BG_NORMAL = "#FFFFFF"
' 強調時の背景色
Private Const BG_HIGHLIGHT = "#FFE7E7"
' 選択時の背景色
Private Const BG_SELECTED = "#EF9A94"
</code></pre>
<h3 id="既存処理の修正"><a href="#%E6%97%A2%E5%AD%98%E5%87%A6%E7%90%86%E3%81%AE%E4%BF%AE%E6%AD%A3">既存処理の修正</a></h3>
<p>データグリッドビューのセル値が変更(が確定)された際のイベントで背景色を変更します。</p>
<p>Form1.vb</p>
<pre><code> ''' <summary>
''' データグリッドビューのセル値が変更(が確定)された際のイベント
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub dgv_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles dgv.CellValueChanged
If (TypeOf dgv(e.ColumnIndex, e.RowIndex) Is DataGridViewCheckBoxCell) Then
Dim chk As DataGridViewCheckBoxCell = dgv(e.ColumnIndex, e.RowIndex)
Dim dgs = New DataGridViewCellStyle()
If (chk.Value = True) Then
dgs.BackColor = System.Drawing.ColorTranslator.FromHtml(BG_SELECTED)
Else
dgs.BackColor = System.Drawing.ColorTranslator.FromHtml(BG_NORMAL)
End If
dgv.Rows(e.RowIndex).DefaultCellStyle = dgs
End If
End Sub
</code></pre>
<h3 id="新規イベントの追加"><a href="#%E6%96%B0%E8%A6%8F%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AE%E8%BF%BD%E5%8A%A0">新規イベントの追加</a></h3>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbGridCheck2_000.jpg" alt="新規イベントの追加" /></p>
<p>CellMouseEnter、CellMouseLeaveの2つを追加します。</p>
<p>マウスオーバーした際に背景色を変更して強調します。</p>
<p>Form1.vb</p>
<pre><code> ''' <summary>
''' データグリッドビューのセルにマウスポインターがフォーカスした際のイベント
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub dgv_CellMouseEnter(sender As Object, e As DataGridViewCellEventArgs) Handles dgv.CellMouseEnter
' ヘッダーは処理しない
If e.ColumnIndex >= 0 And e.RowIndex >= 0 Then
Dim dgv As DataGridView = CType(sender, DataGridView)
' 背景色を変更する
dgv.Rows(e.RowIndex).DefaultCellStyle.BackColor = System.Drawing.ColorTranslator.FromHtml(BG_HIGHLIGHT)
End If
End Sub
''' <summary>
''' データグリッドビューのセルからマウスポインターがフォーカスアウトした際のイベント
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub dgv_CellMouseLeave(sender As Object, e As DataGridViewCellEventArgs) Handles dgv.CellMouseLeave
' ヘッダーは処理しない
If e.ColumnIndex >= 0 And e.RowIndex >= 0 Then
Dim dgv As DataGridView = CType(sender, DataGridView)
If (dgv(0, e.RowIndex).Value) Then
' 選択された状態に戻す
dgv.Rows(e.RowIndex).DefaultCellStyle.BackColor = System.Drawing.ColorTranslator.FromHtml(BG_SELECTED)
Else
' 背景色を戻す
dgv.Rows(e.RowIndex).DefaultCellStyle.BackColor = System.Drawing.ColorTranslator.FromHtml(BG_NORMAL)
End If
End If
End Sub
</code></pre>
<h2 id="起動してみる"><a href="#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">起動してみる</a></h2>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbGridCheck2_001.jpg" alt="マウスオーバーでの強調表示" /></p>
<p>マウスポインターがある行が強調表示されます。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbGridCheck2_002.jpg" alt="チェックで強調表示" /></p>
<p>チェックすると選択された行の背景色が変わります。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbGridCheck2_003.jpg" alt="両方" /></p>
<p>無事にマウスオーバーで強調表示、チェックボックスにチェックで選択表示ができました。</p>
<h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2>
<p>C#と同様、VB.NETでも色々な事ができそうです。<br />
せっかくなので、この後はまたデータベースからデータをひっぱってきたりってのをやろうかと思います。</p>
<p>ではでは。</p>
doraxdora
tag:crieit.net,2005:PublicArticle/15393
2019-09-13T09:40:08+09:00
2019-09-13T09:40:08+09:00
https://crieit.net/posts/VB-NET-5d7ae568f1244
【VB.NET】データグリッドビューで行毎のチェックボックスにイベントを仕込む
<p>今回は、データグリッドに配置したチェックボックス列にイベントを仕込みたいと思います。</p>
<p>プログラムは前回のものを流用。<br />
<a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/12/15/post-3456/" target="_blank" rel="noopener noreferrer" data-blogcard="1">【VB.NET】データグリッドビューで行毎のコンボボックスにイベントを仕込む</a></p>
<h2 id="プログラムの修正"><a href="#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E4%BF%AE%E6%AD%A3">プログラムの修正</a></h2>
<h3 id="新規イベントの追加"><a href="#%E6%96%B0%E8%A6%8F%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AE%E8%BF%BD%E5%8A%A0">新規イベントの追加</a></h3>
<p>データグリッドビューの現在のセル状態が変更された際のイベントを追加します。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbGridCheck000.jpg" alt="新規イベントの追加①" /></p>
<p>Form1.vb</p>
<pre><code> ''' <summary>
''' データグリッドビューの現在のセル状態が変更された際のイベント
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub dgv_CurrentCellDirtyStateChanged(sender As Object, e As EventArgs) Handles dgv.CurrentCellDirtyStateChanged
' 対象のセルを判定
If dgv.CurrentCellAddress.X = 0 AndAlso dgv.IsCurrentCellDirty Then
' 変更を確定する
dgv.CommitEdit(DataGridViewDataErrorContexts.Commit)
End If
End Sub
</code></pre>
<p> </p>
<p>データグリッドビューのセル値が変更された際のイベントを追加</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbGridCheck001.jpg" alt="新規イベントの追加②" /></p>
<p>Form1.vb</p>
<pre><code> ''' <summary>
''' データグリッドビューのセル値が変更(が確定)された際のイベント
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub dgv_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles dgv.CellValueChanged
If (TypeOf dgv(e.ColumnIndex, e.RowIndex) Is DataGridViewCheckBoxCell) Then
Dim chk As DataGridViewCheckBoxCell = dgv(e.ColumnIndex, e.RowIndex)
MessageBox.Show(e.RowIndex + 1 & "行目のチェックボックス値:" & chk.Value)
End If
End Sub
</code></pre>
<p> </p>
<p>データグリッドビューのセルがクリック(マウスダウン)された際のイベントを追加</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbGridCheck002.jpg" alt="新規イベントの追加③" /></p>
<p>Form1.vb</p>
<pre><code> ''' <summary>
''' データグリッドビューのセルをクリック(マウスダウン)した際のイベント
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub dgv_CellMouseDown(sender As Object, e As DataGridViewCellMouseEventArgs) Handles dgv.CellMouseDown
If (TypeOf dgv(e.ColumnIndex, e.RowIndex) Is DataGridViewCheckBoxCell) Then
Dim cell As DataGridViewCheckBoxCell = dgv(e.ColumnIndex, e.RowIndex)
cell.Value = If(cell.Value = False, True, False)
' 変更を確定する
dgv.CommitEdit(DataGridViewDataErrorContexts.Commit)
dgv.EndEdit()
End If
End Sub
</code></pre>
<p> </p>
<h2 id="起動してみる"><a href="#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">起動してみる</a></h2>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbGridCheck003.jpg" alt="チェックしてみる" /></p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbGridCheck004.jpg" alt="チェックを外してみる" /></p>
<p>無事に処理できましたね。</p>
<h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2>
<p>次回は、チェックされた行の背景色を変更してみたいと思います。</p>
<p><a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/12/20/post-3502/" target="_blank" rel="noopener noreferrer">【VB.NET】データグリッドビューでチェックされた行の背景色を変更する</a></p>
<p>ではでは。</p>
doraxdora
tag:crieit.net,2005:PublicArticle/15388
2019-09-11T09:55:11+09:00
2019-09-11T09:55:11+09:00
https://crieit.net/posts/VB-NET-5d7845ef59cd6
【VB.NET】データグリッドビューで行毎のコンボボックスにイベントを設定する
<p>引き続きVB.NETの話し。<br />
今回はデータグリッドビューに配置したコンボボックスにイベントを設定するといったことをやってみます。</p>
<p>プログラムは前回のものを流用します。<br />
<a target="_blank" rel="nofollow noopener" href="https://www.doraxdora.com/blog/2017/12/14/3439/" target="_blank" rel="noopener noreferrer" data-blogcard="1">【VB.NET】データグリッドビューを動的に作成する</a></p>
<h2 id="プログラムの修正"><a href="#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E4%BF%AE%E6%AD%A3">プログラムの修正</a></h2>
<h3 id="新規メソッド追加"><a href="#%E6%96%B0%E8%A6%8F%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E8%BF%BD%E5%8A%A0">新規メソッド追加</a></h3>
<p>ドロップダウンが(選択されて)閉じられた際の処理を新規メソッドで定義</p>
<p>Form1.vb</p>
<pre><code> ''' <summary>
''' データグリッドビューのコンボボックスが閉じられた際のイベント
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub dataGridViewComboBox_DropDownClosed(ByVal sender As Object,
ByVal e As EventArgs)
Dim cb As DataGridViewComboBoxEditingControl =
DirectCast(sender, DataGridViewComboBoxEditingControl)
cb.EditingControlDataGridView.NotifyCurrentCellDirty(True)
' 行ごとに処理を変更する
If cb.EditingControlRowIndex = 0 Then
MessageBox.Show("1行目のコンボボックス:" & cb.SelectedItem)
ElseIf cb.EditingControlRowIndex = 1 Then
MessageBox.Show("2行目のコンボボックス:" & cb.SelectedItem)
ElseIf cb.EditingControlRowIndex = 2 Then
MessageBox.Show("3行目のコンボボックス:" & cb.SelectedItem)
End If
cb.EditingControlDataGridView.EndEdit()
End Sub
</code></pre>
<p>ここで、行インデックスや、列インデックス、または名前などを判定して処理を分岐します。</p>
<h3 id="新規イベント追加"><a href="#%E6%96%B0%E8%A6%8F%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E8%BF%BD%E5%8A%A0">新規イベント追加</a></h3>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/ESP000001.jpg" alt="イベントの追加" /></p>
<p>デザイナー画面でデータグリッドビューを選択し、プロパティ画面から対象のイベントを作成します。</p>
<p>データグリッドビューのセル内に設置したコンボボックスの内容が表示された際に、ドロップダウンが(選択されて)閉じられたイベントを追加します。</p>
<p>From1.vb</p>
<pre><code> ''' <summary>
''' 編集中コントロールが表示されている際のイベント
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub dgv_EditingControlShowing(sender As Object, e As DataGridViewEditingControlShowingEventArgs) Handles dgv.EditingControlShowing
Dim cb = TryCast(e.Control, DataGridViewComboBoxEditingControl)
If cb Is Nothing Then Return
RemoveHandler cb.DropDownClosed, AddressOf dataGridViewComboBox_DropDownClosed
AddHandler cb.DropDownClosed, AddressOf dataGridViewComboBox_DropDownClosed
End Sub
</code></pre>
<h3 id="既存処理の修正"><a href="#%E6%97%A2%E5%AD%98%E5%87%A6%E7%90%86%E3%81%AE%E4%BF%AE%E6%AD%A3">既存処理の修正</a></h3>
<p>データグリッド内のコンボボックスを選択した際に、<br />
同じコンボボックスを連続でクリックすると正しく開かない問題が発覚したため既存の処理も修正。</p>
<p>Form1.vb</p>
<pre><code> ''' <summary>
''' データグリッドビューセルクリックイベント
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub dgv_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgv.CellClick
Dim dgv As DataGridView = CType(sender, DataGridView)
gridComboHandle(dgv, e)
End Sub
''' <summary>
''' データグリッドビューのコンボボックス制御
''' </summary>
''' <param name="dgv"></param>
''' <param name="e"></param>
Private Sub gridComboHandle(dgv As DataGridView, e As DataGridViewCellEventArgs)
' 対象の列だった場合
If dgv.Columns(e.ColumnIndex).Name = "col3" Then
SendKeys.SendWait("{F4}")
End If
End Sub
</code></pre>
<p>データグリッドビューのセルエンターイベントで処理していたのを、<br />
セルクリックに変更して、更に「SendKey.Send」を「SendKey.SendWait」に変更。</p>
<h2 id="起動してみる"><a href="#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">起動してみる</a></h2>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/ESP000002.jpg" alt="起動後の画面" /></p>
<p>起動後の画面です。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/ESP000003.jpg" alt="コンボボックスを選択" /></p>
<p>コンボボックスを選択します。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/ESP000004.jpg" alt="イベントが処理される" /></p>
<p>イベントが処理され、メッセージボックスが表示されました。</p>
<h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2>
<p>データグリッドビューにコンポーネントを配置するってよくある話しだと思うんですが、何で標準でもっと便利にしてくれないんでしょうかね。</p>
<p>ちょっとハマった部分は、コンボボックスを1回で開くところですね。<br />
まあなんとかなってよかったです。</p>
<p>また何かあれば記事にしようと思います。</p>
<p>ではでは。</p>
<p> </p>
doraxdora
tag:crieit.net,2005:PublicArticle/15386
2019-09-10T09:47:55+09:00
2019-09-10T09:47:55+09:00
https://crieit.net/posts/VB-NET
【VB.NET】データグリッドビューを動的に作成して行毎に違う内容のコンボボックスを表示する
<p>ちょっと仕事の関係でVB.NETを使う機会があったので、備忘的な記事になります。</p>
<p>完全にデータグリッドビューの使い方からは外れてしまうのかもしれませんが、<br />
行ごとに別の内容のコンボボックスを表示するといったことをやりました。</p>
<p>まずはサンプルプロジェクトの作成から。</p>
<h2 id="プロジェクトの新規作成"><a href="#%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E6%96%B0%E8%A6%8F%E4%BD%9C%E6%88%90">プロジェクトの新規作成</a></h2>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbGridConb000.jpg" alt="プロジェクトの作成" /></p>
<p>VisualStudio2017 を起動し、上部メニューの「ファイル」>「新規作成」>「プロジェクト」を選択します。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbGridConb001.jpg" alt="プロジェクト名の入力" /></p>
<p>新しいプロジェクト作成ウィザードが表示されるので、<br />
「Visual Basic」>「Windowsフォームアプリケーション」を選択、名前を入力して「OK」ボタンをクリックします。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbGridConb002.jpg" alt="デザイナー画面" /></p>
<p>作成後はデザイナー画面が表示されます。</p>
<p>とりあえずプロジェクトの作成はこれで完了です。</p>
<h2 id="データグリッドビューの配置"><a href="#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B0%E3%83%AA%E3%83%83%E3%83%89%E3%83%93%E3%83%A5%E3%83%BC%E3%81%AE%E9%85%8D%E7%BD%AE">データグリッドビューの配置</a></h2>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbGridConb003.jpg" alt="データグリッドビューの配置" /></p>
<p>ツールボックスから「DataGridView」を選択して画面に配置します。<br />
サイズなんかはとりあえず適当で大丈夫です。</p>
<h3 id="名前の設定"><a href="#%E5%90%8D%E5%89%8D%E3%81%AE%E8%A8%AD%E5%AE%9A">名前の設定</a></h3>
<p>プロパティから、「Name」の項目に「dgv」を設定しておきます。<br />
(コードビハインドから操作する際にこの項目を使用します)</p>
<h3 id="イベントの追加"><a href="#%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88%E3%81%AE%E8%BF%BD%E5%8A%A0">イベントの追加</a></h3>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbGridConb004.jpg" alt="イベントの追加" /></p>
<p>データグリッドビューを選択した状態でプロパティから、イベントメニューを選択、<br />
「Load」の項目をダブルクリックして起動時の処理を追加します。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbGridConb005.jpg" alt="イベントの追加2" /></p>
<p>また、データグリッドビューのセルに設置するコンボボックスのために、<br />
「CellEnter」の項目もイベントを追加しておきます。</p>
<h2 id="処理の実装"><a href="#%E5%87%A6%E7%90%86%E3%81%AE%E5%AE%9F%E8%A3%85">処理の実装</a></h2>
<p>Form1.vb(コード)に、プログラムを記述します。</p>
<h3 id="ロードイベント"><a href="#%E3%83%AD%E3%83%BC%E3%83%89%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88">ロードイベント</a></h3>
<pre><code> ''' <summary>
''' フォームロードイベント.
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim mainList As String() = {"ユーザー", "集客", "行動", "コンバージョン"}
Dim userList As String() = {"アクティブユーザー", "ライフタイムバリュー", "コポート分析"}
Dim syukyakuList As String() = {"全てのトラフィック", "AdWords", "Search Console"}
Dim koudouList As String() = {"行動フロー", "サイトコンテンツ", "サイトの速度"}
' データグリッドの設定
dgv.AllowUserToAddRows = False
dgv.AllowUserToResizeRows = False
dgv.AllowUserToResizeColumns = False
dgv.RowHeadersVisible = False
' ヘッダースタイル定義(共通)
Dim headerStyle As New DataGridViewCellStyle()
headerStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
' チェックボックス列追加
Dim checkCol As DataGridViewTextBoxColumn = New DataGridViewTextBoxColumn()
checkCol.HeaderCell.Style = headerStyle
checkCol.HeaderText = "選択"
checkCol.Name = "col1"
checkCol.DataPropertyName = "col1"
checkCol.Width = 40
dgv.Columns.Add(checkCol)
' スタイル設定
Dim checkStyle As New DataGridViewCellStyle()
checkStyle.Alignment = DataGridViewContentAlignment.MiddleCenter
checkCol.DefaultCellStyle = checkStyle
' テキスト列追加
Dim textCol As DataGridViewTextBoxColumn = New DataGridViewTextBoxColumn()
textCol.HeaderCell.Style = headerStyle
textCol.HeaderText = "メニュー"
textCol.Name = "col2"
textCol.DataPropertyName = "col2"
textCol.Width = 120
dgv.Columns.Add(textCol)
' コンボボックス列の追加
Dim cbCol As DataGridViewTextBoxColumn = New DataGridViewTextBoxColumn()
cbCol.HeaderCell.Style = headerStyle
cbCol.HeaderText = "項目"
cbCol.Name = "col3"
cbCol.DataPropertyName = "col3"
cbCol.Width = 150
dgv.Columns.Add(cbCol)
Dim i As Short
For i = 0 To mainList.Length - 1
' 行追加
dgv.Rows.Add()
' チェックボックス
Dim chk As New DataGridViewCheckBoxCell()
chk.Value = False
dgv(0, i) = chk
' テキストボックス
Dim txt As New DataGridViewTextBoxCell()
txt.Value = mainList(i)
dgv(1, i) = txt
Dim cmb As New DataGridViewComboBoxCell()
If (mainList(i) = "ユーザー") Then
cmb.Items.AddRange(userList)
dgv(2, i) = cmb
dgv(2, i).Value = userList(0)
ElseIf (mainList(i) = "集客") Then
cmb.Items.AddRange(syukyakuList)
dgv(2, i) = cmb
dgv(2, i).Value = syukyakuList(0)
ElseIf (mainList(i) = "行動") Then
cmb.Items.AddRange(koudouList)
dgv(2, i) = cmb
dgv(2, i).Value = koudouList(0)
ElseIf (mainList(i) = "コンバージョン") Then
' コンボボックスを設定しない
End If
Next
End Sub
</code></pre>
<h3 id="データグリッドビューのセルエンターイベント"><a href="#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B0%E3%83%AA%E3%83%83%E3%83%89%E3%83%93%E3%83%A5%E3%83%BC%E3%81%AE%E3%82%BB%E3%83%AB%E3%82%A8%E3%83%B3%E3%82%BF%E3%83%BC%E3%82%A4%E3%83%99%E3%83%B3%E3%83%88">データグリッドビューのセルエンターイベント</a></h3>
<pre><code> ''' <summary>
''' データグリッドビューセルエンターイベント.
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub dgv_CellEnter(sender As Object, e As DataGridViewCellEventArgs) Handles dgv.CellEnter
' データグリッドビューを取得
Dim dgv As DataGridView = CType(sender, DataGridView)
gridComboHandle(dgv, e)
End Sub
</code></pre>
<h3 id="データグリッドビューのコンボボックス制御"><a href="#%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B0%E3%83%AA%E3%83%83%E3%83%89%E3%83%93%E3%83%A5%E3%83%BC%E3%81%AE%E3%82%B3%E3%83%B3%E3%83%9C%E3%83%9C%E3%83%83%E3%82%AF%E3%82%B9%E5%88%B6%E5%BE%A1">データグリッドビューのコンボボックス制御</a></h3>
<p>通常だと、データグリッドビューに設置したコンボボックスは一回のクリックで開いてくれない。<br />
それをなんとかするための措置。</p>
<pre><code> ''' <summary>
''' データグリッドビューのコンボボックス制御
''' </summary>
''' <param name="dgv"></param>
''' <param name="e"></param>
Private Sub gridComboHandle(dgv As DataGridView, e As DataGridViewCellEventArgs)
' 対象のグリッドであれば
If dgv.Columns(e.ColumnIndex).Name = "col3" Then
SendKeys.Send("{F4}")
End If
End Sub
</code></pre>
<h2 id="起動してみる"><a href="#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">起動してみる</a></h2>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbGridConb006.jpg" alt="起動後の画面" /></p>
<p>ひとまずグリッドに内容が表示されました。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbGridConb007.jpg" alt="1行目のコンボボックス" /></p>
<p>1行目のコンボボックスの内容です。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2017/12/VbGridConb008.jpg" alt="2行目のコンボボックス" /></p>
<p>2行目のコンボボックスの内容です。</p>
<p>ひとまず目的のことはできましたね。</p>
<h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2>
<p>本来であれば、データグリッドビューではなく他のコントローラで実現すべきところなんだと思いますが、顧客からの要望なんかでやらざるをえない場合もありますよね。</p>
<p>何かの参考になれば。</p>
<p>ではでは。</p>
doraxdora
tag:crieit.net,2005:PublicArticle/15382
2019-09-08T13:20:10+09:00
2019-09-08T13:20:10+09:00
https://crieit.net/posts/C-DataGridView-5d74817aadc39
【C#】DataGridView の 行選択時にチェックボックスの状態を変更する(その2)
<p>前回のものを少し改良しました。</p>
<p>変更したのは主に下記の制御。</p>
<pre><code>ドラッグでの複数選択
Shift または Ctrl を押しながらの選択
チェックボックスを直接チェックした場合の挙動
</code></pre>
<h2 id="プログラム"><a href="#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0">プログラム</a></h2>
<p>Form1.cs</p>
<pre><code>using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace SampleDataGridCheckbox
{
/// <summary>
/// サンプルフォーム
/// </summary>
public partial class Form1 : Form
{
/// <summary>
/// 初期化処理
/// </summary>
public Form1()
{
InitializeComponent();
dataGridView1.Rows.Add(false, "テスト1", "テスト1");
dataGridView1.Rows.Add(false, "テスト2", "テスト2");
dataGridView1.Rows.Add(false, "テスト3", "テスト3");
dataGridView1.Rows.Add(false, "テスト4", "テスト4");
dataGridView1.Rows.Add(false, "テスト5", "テスト5");
dataGridView1.Rows.Add(false, "テスト6", "テスト6");
dataGridView1.ClearSelection();
}
/// <summary>
/// データグリッドビューセルクリックイベント.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
// ヘッダー以外
if (e.RowIndex >= 0)
{
// クリックされた箇所を特定
DataGridViewCell cell = dataGridView1.CurrentCell;
if (cell.OwningColumn.Name == "Column1")
{
if (cell.Value.ToString() == "False")
{
dataGridView1.Rows[e.RowIndex].SetValues(true);
}
else
{
dataGridView1.Rows[e.RowIndex].SetValues(false);
}
}
else
{
if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift)
{
return;
}
if ((Control.ModifierKeys & Keys.Control) == Keys.Control)
{
return;
}
// Shift or Ctrl キーが押されていなければクリック行以外をクリア
dataGridView1.ClearSelection();
dataGridView1.Rows[cell.RowIndex].Selected = true;
}
}
}
/// <summary>
/// データグリッドビュー選択変更イベント.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
// 選択されたセルを判定
DataGridViewCell cell = dataGridView1.CurrentCell;
if (cell.OwningColumn.Name != "Column1")
{
// 選択行のチェックボックスの状態を制御
foreach (DataGridViewRow row in dataGridView1.Rows)
{
if (row.Selected)
{
dataGridView1.Rows[row.Index].SetValues(true);
}
else
{
dataGridView1.Rows[row.Index].SetValues(false);
}
}
}
}
}
}
</code></pre>
<h2 id="起動してみる"><a href="#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">起動してみる</a></h2>
<p>GIFイメージ</p>
<p><img src="http://www.doraxdora.com/wp-content/uploads/2018/12/CSharpDataGridCheckBoxColumn2.gif" alt="GIFイメージ" /></p>
<p>SCREENPRESSOでGIF動画を撮ってみました。</p>
<h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2>
<p>前回のものがちょっと納得いかなかったので改めて。</p>
<p>DataGridViewに別のチェックボックスやコンボボックスを配置する要件なんて、<br />
とりあえず需要があることだろうに標準で用意してほしいですよね。</p>
<p>昨日以上にサクッとしてますが以上です。</p>
<p>ではでは。</p>
doraxdora
tag:crieit.net,2005:PublicArticle/15379
2019-09-06T13:29:56+09:00
2019-09-06T13:29:56+09:00
https://crieit.net/posts/C-DataGridView
【C#】DataGridView の 行選択時にチェックボックスの状態を変更する(その1)
<p>データグリッドビューにチェックボックスを配置して、<br />
行を選択したらチェックの状態も一緒に変更するサンプル。</p>
<h2 id="画面"><a href="#%E7%94%BB%E9%9D%A2">画面</a></h2>
<p>Windows Form でプロジェクトを作成し、画面にデータグリッドビューを配置します。</p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2018/12/CSharpDataGridCheckBoxColumn000.jpg" alt="画面の作成" /></p>
<p>先頭列をチェックボックス(DataGridViewCheckBoxColumn)にして、他は適当にテキストボックス列を2列を追加。</p>
<h3 id="プロパティ"><a href="#%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3">プロパティ</a></h3>
<p>変更したプロパティはだいたい次のような感じ。</p>
<p>プロパティ<br />
説明<br />
デフォルト<br />
変更後</p>
<p>AllowUserToResizeRows<br />
ユーザーが列のサイズを変更できるかどうか<br />
True<br />
False</p>
<p>EditMode<br />
セルの編集が開始される方法を決定するモード<br />
EditOnKeystrokeOrF2<br />
EditProgrammatically</p>
<p>SelectionMode<br />
DataGridView のセルの選択方法<br />
RowHeaderSelect<br />
FullRowSelect</p>
<p>RowHeadersVisible<br />
行ヘッダーを含んでいる列が表示されるかどうか<br />
True<br />
False</p>
<h3 id="メソッド"><a href="#%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89">メソッド</a></h3>
<p>メソッドは、「CellClick」のみ追加。</p>
<h2 id="プログラム"><a href="#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0">プログラム</a></h2>
<pre><code>using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace SampleDataGridCheckbox
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
dataGridView1.Rows.Add(false, "テスト1", "テスト1");
dataGridView1.Rows.Add(false, "テスト2", "テスト2");
dataGridView1.Rows.Add(false, "テスト3", "テスト3");
dataGridView1.Rows.Add(false, "テスト4", "テスト4");
dataGridView1.Rows.Add(false, "テスト5", "テスト5");
dataGridView1.Rows.Add(false, "テスト6", "テスト6");
}
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
DataGridViewCheckBoxCell cell = (DataGridViewCheckBoxCell)dataGridView1[0, e.RowIndex];
if (cell.Value.ToString() == "False")
{
dataGridView1.Rows[e.RowIndex].SetValues(true);
}
else
{
dataGridView1.Rows[e.RowIndex].SetValues(false);
}
}
}
}
</code></pre>
<p>初期表示時に、テスト用のデータを6件ほど、データグリッドビューの行に追加。</p>
<h2 id="起動してみる"><a href="#%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B">起動してみる</a></h2>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2018/12/CSharpDataGridCheckBoxColumn001.jpg" alt="初期表示" /></p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2018/12/CSharpDataGridCheckBoxColumn002.jpg" alt="行を選択" /></p>
<p><img src="https://www.doraxdora.com/wp-content/uploads/2018/12/CSharpDataGridCheckBoxColumn003.jpg" alt="再度選択" /></p>
<p>無事に行を選択するとチェックされるようになりました。</p>
<h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2>
<p>DataGridViewに表示するデータをDBから取得して、<br />
DataSourceに設定するといった場合は、列の指定をインデックスではなく列名で指定した方が無難かと思います。</p>
<p>サクッとした話ですが以上。</p>
<p>ではでは。</p>
<p> </p>
doraxdora