tagCANDY CGI VBレスキュー(花ちゃん) - VBレスキュー(花ちゃん)の投稿サンプル用掲示板 - Visual Basic 6.0 VB2005 VB2010
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
VBレスキュー(花ちゃん)の投稿サンプル用掲示板
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
DataGridViewでチェックボックスを表示する(VB.NET) ( No.0 )  [親スレッドへ]
日時: 2010/02/25 22:33
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[グリッド関係][ファイル入出力][データベース]                        *
* キーワード:CSVファイル,データグリッドビュー,ADO.NET,DataGridViewCheckBoxColumn *
***********************************************************************************
投 稿 日 : 2010/01/26
投 稿 者 : 花ちゃん
'===================================================================================================
'動作確認:WindowsVista VB2008(EE) Framework 3.5
'[Option Compare Text] [Option Explicit On] [Option Infer On] [Option Strict On]で設定
'表示用データは、CSVファイルをADO.NETを使ってDataGridViewに表示(VB.NET) と同じデータを使って下さい。
'使用コントロール及び配置は、下図を参照して下さい。
'---------------------------------------------------------------------------------------------------
下記サンプルで使用している Tips
1.ADO.NETを使って、CSVファイルをDataGridViewに表示
2.DataGridViewに表示したデータを全部消去する
3.DataGridViewの列幅を設定する
4.DataGridViewの指定列にチェックボックスを表示する
5.DataGridViewのセルの表示アライメントを設定
  指定列のバックカラー・フォアカラーを設定する
  指定列のフォントを設定する
  指定列のデーターの表示を桁区切りで表示する
6.チェック行を高速に取得(Listジェネリックを使って、TrueのIndexを保存)
7.チェック行を全て解除する
8.指定のセルの値により、チェックボックスにチェックを入れる
9.指定のセルの値により、指定のセルのカラーを変更する

Imports System.Data.OleDb

Public Class Form1

Dim CheckedItems As New List(Of Integer)  'チェックされている行インデックスの保存用

Private Sub Button1_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles Button1.Click
'■---------- DataGridView の表示を一旦全消去 ------------Start--■
   '--------- この部分は通常は必要ありません -------------
   '今回の場合ボタンを何度もクリックすると複数列にチェックボックスが作成されるので
   DataGridView1.Columns.Clear()
   'ヘッダースタイルを初期値に
   Dim chs As New DataGridViewCellStyle
   DataGridView1.ColumnHeadersDefaultCellStyle = chs
'■-------------------------------------------------------End----■

'----------以下、通常の表示と同じ------------------------

   Using cn As New OleDbConnection, cm As New OleDbCommand, da As New OleDbDataAdapter
      Dim ds As New DataSet
      '最下部の新しい行(追加オプション)を非表示にする
      DataGridView1.AllowUserToAddRows = False
      'データファイルのフォルダパスを設定
      Dim FolderPath As String = Application.StartupPath()
      Dim csvFileName As String = "test.csv"
      Dim TableName As String = "Table1"
      'データベースに接続するための情報を設定する
      cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FolderPath & _
                  ";Extended Properties=""Text;HDR=YES;IMEX=1;FMT=Delimited"""
      'コネクションの設定
      cm.Connection = cn
      'データソースで実行するSQL文の設定
      cm.CommandText = "SELECT * from " & csvFileName
      'データソース内のレコードを選択するためのSQLコマンドの設定
      da.SelectCommand = cm
      'データを取得する
      da.Fill(ds, TableName)
      'データグリッドに表示するデータソースを設定
      DataGridView1.DataSource = ds
      'グリッドを表示するための、DataSource 内のリストを設定
      DataGridView1.DataMember = TableName

'--------------ここまでは通常の表示と同じ----------------------------------

'■---------------------- チェックボックス列を作成 --------------------Start--■
'1列目をチェックボックスの列に設定及び初期設定
      Dim newColumn As New DataGridViewCheckBoxColumn
      newColumn.HeaderText = "補習要否"                  '列名の設定
      DataGridView1.Columns.Insert(1, newColumn)         '1列目に挿入
      CheckedItems.Clear()                               'チェックデータを消去
'■--------------------------------------------------------------------End----■

'■------------------- 列幅を設定 ----------------Start--■
'ついでに、列幅を設定
      With DataGridView1
         For i As Integer = 0 To .Columns.Count - 1
            Dim cw As Integer = 60     'Default の幅(任意で、今回は一番多い設定幅に指定)
            Select Case i
               Case 0
                  cw = 30
               Case 2
                  cw = 100
               Case 6
                  cw = 80
            End Select
            .Columns(i).Width = cw
         Next i
      End With
'■-----------------------------------------------End----■

'■------------------- セルの表示アライメントを設定 ----------------Start--■
      With DataGridView1
         For i As Integer = 0 To .Columns.Count - 1
            'デフォルトの設定(一番多い設定に合せる)
            Dim csStyle As New DataGridViewCellStyle
            csStyle.Font = DataGridView1.Font
            csStyle.Alignment = DataGridViewContentAlignment.MiddleRight
            Select Case i
               Case 1
                  'チェックボックスなので元の設定のまま
                  csStyle = .Columns(i).DefaultCellStyle
               Case 2   '右揃え
                  csStyle.Font = New Font("MS P明朝", 10, FontStyle.Bold)
                  csStyle.Alignment = DataGridViewContentAlignment.MiddleLeft
               Case 6   '桁区切りスタイル
                  csStyle.Format = "#,##0.0"
                  csStyle.Font = New Font("MS ゴシック", 10, FontStyle.Bold)
                  csStyle.ForeColor = Color.Blue
            End Select
            .Columns(i).DefaultCellStyle = csStyle
         Next i
      End With
'■-----------------------------------------------------------------End----■

   'データソースへの接続を閉る
   '(上記のように宣言すると End Using は、下記のように1個でOKのようです。)
   End Using
End Sub

Private Sub DataGridView1_CurrentCellDirtyStateChanged(ByVal sender As Object, _
      ByVal e As System.EventArgs) Handles DataGridView1.CurrentCellDirtyStateChanged
'セルの内容の変更に合わせてセルの状態が変化した場合に発生します
'(これがないと次にイベントが発生した時にしか取得できない)
   '現在のセルがコミットされていない変更を含む場合
   If DataGridView1.IsCurrentCellDirty = True Then
      'CommitEdit メソッドを呼ぶ事によってCellValueChanged イベントを発生させます。
      DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit)
   End If
End Sub

Private Sub DataGridView1_CellValueChanged(ByVal sender As Object, _
                     ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) _
                                    Handles DataGridView1.CellValueChanged
   'List ジェネリック を使って、True の Index を保存
   'List ジェネリック を使用すると下記のように書き込み、削除が、重複しないで簡単にできる
   If e.ColumnIndex = 1 Then
      If CBool(DataGridView1(e.ColumnIndex, e.RowIndex).Value) = True Then
         'e.RowIndex を保存
         CheckedItems.Add(e.RowIndex)
      Else
         'e.RowIndex と同じものがあれば、削除する
         CheckedItems.Remove(e.RowIndex)
      End If
   End If

'チェックマークの変更があった事を取得
   'データ数が少ない場合はこれでも十分だとは思うのですが。
   'If e.ColumnIndex = 0 Then
   '   Debug.WriteLine(String.Format("{0}行目のチェックボックスが{1}に変わりました。", _
   '                           e.RowIndex, DataGridView1(e.ColumnIndex, e.RowIndex).Value))
   'End If
End Sub

Private Sub Button2_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles Button2.Click
'チェックされている項目の一覧を高速に取得

   '通常は下記のように総当たりで調べる(データが少ないのならこれでもOK)
   'For i As Integer = 0 To DataGridView1.Rows.Count - 1
   '   If CBool(DataGridView1(1, i).Value) = True Then
   '      Debug.WriteLine(i)
   '   End If
   'Next

   '判りやすようにソート(必須ではありません)
   CheckedItems.Sort()
   'チェックされている項目の一覧を高速に取得
   For Each no As Integer In CheckedItems
      Debug.WriteLine(no)
   Next
End Sub

Private Sub Button3_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles Button3.Click
'チェックされている項目をすべて解除する
   'Count の降順に外して行かないとエラーになるので注意
   For i As Integer = CheckedItems.Count - 1 To 0 Step -1
      DataGridView1(1, CheckedItems(i)).Value = False
   Next
   'CheckedItems.Clear()
End Sub

Private Sub Button4_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles Button4.Click
'合計点が、230 点以下の場合、赤色で表示し、チェックボックスにチェックを入れる
   For i As Integer = 0 To DataGridView1.Rows.Count - 1
      If CSng(DataGridView1(6, i).Value) <= 230 Then
         'チェックマークを記入
         DataGridView1(1, i).Value = True
         '合計点を赤で表示
         DataGridView1(6, i).Style.ForeColor = Color.Red
      End If
   Next i

' ※ DataGridView1_CellFormatting イベント内で処理する方法もあります。

End Sub

End Class

詳しくは、下記等で調べて下さい。
--------------------------------------------------------------------------------
ちょっと便利な検索ソフト(http://hanatyan.sakura.ne.jp/yybbs/read.cgi?no=117)
を使って、キーワード【DataGridViewCheckBoxColumn】での検索結果(当サイト内・外の検索でも同じ)

  ヒット件数    検索対象サイト名    検索結果のURL(短く変換しています)
         34,600 件  ■ウェブ全体から検索       http://tinyurl.com/ylgvsb9
          2,100 件  ●msdn.microsoft.com/      http://tinyurl.com/ygoj4ot
          1,280 件  DOBON.NET                  http://tinyurl.com/yf4wydj
             60 件  わんくま同盟               http://tinyurl.com/yz834xj
              4 件  アットマーク・アイティ     http://tinyurl.com/yjqryfs
              1 件  Programing Library         http://tinyurl.com/yfkx2c3
              0 件  Visual Basic 中学校        http://www.google.com/webhp?hl=ja
              0 件  ★VBレスキュー(花ちゃん)   http://www.google.com/webhp?hl=ja
              0 件  WinAPI Database for VB...  http://www.google.com/webhp?hl=ja
              0 件  moug モーグ                http://www.google.com/webhp?hl=ja
              0 件  pin's Laboratory           http://www.google.com/webhp?hl=ja
              0 件  Visual Basic Station       http://www.google.com/webhp?hl=ja
              0 件  C# と VB.NET の入門サイト  http://www.google.com/webhp?hl=ja
              0 件  HIRO's.NET                 http://www.google.com/webhp?hl=ja
--------------------------------------------------------------------------------


 上記プログラムの実行図(画像をクリックすると元のサイズで見られます。)



 [スレッド一覧へ] [親スレッドへ]