- 日時: 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 --------------------------------------------------------------------------------
上記プログラムの実行図(画像をクリックすると元のサイズで見られます。)
|