1.DataGridView でのデータの読込・保存・表示関係(18_DGV_01) (旧、SampleNo.309) |
下記プログラムコードに関する補足・注意事項 動作確認:Windows 8.1 (Windows 7) / VB2013 (VB2010) / Framework 4.5.1 / 対象の CPU:x86 Option :[Compare Text] [Explicit On] [Infer On] [Strict On] Imports :追加なし 参照設定:追加なし その他 :使用データは、次よりダウンロードして使って下さい。 dgvdat.zip :このサンプルを使用される前に、左のメニューのDataGridViewでのデータの読込保存関係をご覧になって下さい。 このサンプル等の内容を無断で転載、掲載、配布する事はお断りします。(私の修正・改訂・削除等が及ばなくなるので) 必要ならリンクをはるようにして下さい。(引用の場合は引用元のリンクを明記して下さい) |
1.DataGridView を初期値に設定 |
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click '01.DataGridView を初期値に設定 DGVClear(DataGridView1) '初期化のSub プロシージャを Call '※ 通常は必要ありませんが、Tips の動作確認のために表示状態を元に戻す場合や ' データファイルを読み込み直す場合等に必要なので End Sub Private Sub DGVClear(ByVal dgv As DataGridView) 'DataGridView を初期値に設定するプロシージャ With dgv '列数が>0なら表示されていると判断し、一旦消去(表示速度には影響なし) If .Rows.Count > 0 Then .Columns.Clear() 'コレクションを空にします(行・列削除) .DataSource = Nothing 'DataSource に既定値を設定 .DefaultCellStyle = Nothing 'セルスタイルを初期値に設定 .RowHeadersDefaultCellStyle = Nothing '行ヘッダーを初期値に設定 .RowHeadersVisible = True '行ヘッダーを表示 'フォントの高さ+9 (フォントサイズ 9 の場合、12+9= 21 となる .RowTemplate.Height = 21 'デフォルトの行の高さを設定(表示後では有効にならない) .ColumnHeadersDefaultCellStyle = Nothing '列ヘッダーを初期値に設定 .ColumnHeadersVisible = True '列ヘッダーを表示 .ColumnHeadersHeight = 23 '列ヘッダーの高さを既定値に設定 .TopLeftHeaderCell = Nothing '左端上端のヘッダーを初期値に設定 '奇数行に適用される既定のセルスタイルを初期値に設定 .AlternatingRowsDefaultCellStyle = Nothing 'セルの境界線スタイルを初期値(一重線の境界線)に設定 .AdvancedCellBorderStyle.All = DataGridViewAdvancedCellBorderStyle.Single .GridColor = SystemColors.ControlDark 'セルを区切るグリッド線の色を初期値に設定 .Refresh() '再描画 End If End With '※ 上記設定は、必要により、追加・削除してください。 End Sub |
2.CSV ファイルを ADO.NET を使って DataGridView に読み込み表示 |
1.のコードに下記コードを追加して下さい。 Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click '02.CSV ファイルを ADO.NET を使って DataGridView に読み込み表示 DGVClear(DataGridView1) '初期化のSub プロシージャを Call Using cn As New System.Data.OleDb.OleDbConnection 'データファイルは、EXE と同じフォルダーに入れてください。 'データのあるフォルダー(プログラム起動フォルダーのパスを指定) Dim FolderPath As String = "..\..\..\data" ' Application.StartupPath 'CSV ファイル名 (フルパスで書かないで下さい) Dim dbFileName As String = "dgvtest1.csv" cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data source=" & FolderPath & _ ";Extended Properties=""Text;HDR=YES;IMEX=1;FMT=Delimited""" Using da As System.Data.OleDb.OleDbDataAdapter = _ New System.Data.OleDb.OleDbDataAdapter("SELECT * FROM " & dbFileName, cn) Dim ds As New DataSet da.Fill(ds, dbFileName) 'DataGridView に表示するデータソースを設定 DataGridView1.DataSource = ds.Tables(dbFileName) End Using End Using End Sub 図1.上記実行図及び使用コントロールの配置図 |
3.CSV ファイルを ADO.NET を使って非連結での DataGridView に読み込み表示 |
1.のコードに下記コードを追加して下さい。 Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click '03.CSV ファイルを ADO.NET を使って非連結での DataGridView に読み込み表示 DGVClear(DataGridView1) '初期化のSub プロシージャを Call DataGridView1.RowTemplate.Height = 60 '読み込んだCSVファイルを編集・加工時に楽なように、非連結で表示しています。 '但し、読み込み表示に時間がかかるので、目的やデータに合せて使ってください。 Using cn As New System.Data.OleDb.OleDbConnection 'データのあるフォルダー(プログラム起動フォルダーのパスを指定) Dim FolderPath As String = "..\..\..\data" ' Application.StartupPathh 'CSV ファイル名 (フルパスで書かないで下さい) Dim dbFileName As String = "dgvtest2.csv" 'HDR 等の接続文字列のオプションの詳細説明は下記をご覧下さい。 'http://hanatyan.sakura.ne.jp/vbhlp/dao_002.htm cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data source=" & FolderPath & _ ";Extended Properties=""Text;HDR=YES;IMEX=1;FMT=Delimited""" Using da As System.Data.OleDb.OleDbDataAdapter = _ New System.Data.OleDb.OleDbDataAdapter("SELECT * FROM " & dbFileName, cn) Dim ds As DataSet = New DataSet() da.Fill(ds) '--------------------------------------------------------------------- 'TextBox 列を作成 Dim newColumn(ds.Tables(0).Columns.Count - 1) As DataGridViewTextBoxColumn For i As Integer = 0 To ds.Tables(0).Columns.Count - 1 newColumn(i) = New DataGridViewTextBoxColumn '新規列を挿入 DataGridView1.Columns.Insert(i, newColumn(i)) 'HeaderText を設定 DataGridView1.Columns.Item(i).HeaderText = ds.Tables(0).Columns(i).Caption Next i '行を挿入 DataGridView1.Rows.Insert(0, 1) Dim RcNo As Integer = -1 For Each dr As DataRow In ds.Tables(0).Rows RcNo += 1 If RcNo > 0 Then '行を挿入 Me.DataGridView1.Rows.Insert(RcNo, 1) End If For i As Integer = 0 To ds.Tables(0).Columns.Count - 1 '各列にデータを表示 DataGridView1.Item(i, RcNo).Value = dr(i).ToString Next i Next End Using End Using DataGridView1.Columns(6).DefaultCellStyle.WrapMode = DataGridViewTriState.True DataGridView1.Columns(0).Width = 45 DataGridView1.Columns(1).Width = 60 DataGridView1.Columns(2).Width = 60 DataGridView1.Columns(6).Width = 400 End Sub |
4.CSV ファイルを StreamReader を使って DataGridView に読み込み表示 |
1.のコードに下記コードを追加して下さい。 Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click '04.CSV ファイルを StreamReader を使って DataGridView に読み込み表示 DGVClear(DataGridView1) '初期化のSub プロシージャを Call 'Dim sTime0 As DateTime = Now '読み込み表示の計測時間の開始 Dim DS As New DataSet Dim TB As DataTable = DS.Tables.Add 'データセットにテーブルを追加する Dim dbFileName As String = "..\..\..\data\dgvtest1.csv" '表示するCSVファイルを指定 Dim n As Integer 'CSVファイルをSHIFT_JISのコードページのエンコーディングで読込み Using sr1 As New System.IO.StreamReader(dbFileName, System.Text.Encoding.GetEncoding("SHIFT_JIS")) ' Dim sr1 As New System.IO.StreamReader(filePath, System.Text.Encoding.Default) '項目行を別途設定する場合 'TB.Columns.Add("No", Type.GetType("System.Int16")) 'TB.Columns.Add("氏名", Type.GetType("System.String")) 'TB.Columns.Add("国語", Type.GetType("System.String")) 'TB.Columns.Add("数学", Type.GetType("System.String")) 'TB.Columns.Add("英語", Type.GetType("System.String")) 'TB.Columns.Add("合計点", Type.GetType("System.String")) 'ファイルの最後までループ Do Until sr1.Peek = -1 n = n + 1 If n = 1 Then '先頭行を項目として表示する場合 Dim cmDat() As String = Split(sr1.ReadLine, ",") ' TB.Columns.Add("No", Type.GetType("System.Int16")) 'テーブルにフィールドを追加する For i As Integer = 0 To UBound(cmDat) ' "" で囲まれているデータは、"" を取り除く cmDat(i) = cmDat(i).Trim(Chr(34)) Select Case i Case 1, 7, 13, 19 '文字列 TB.Columns.Add(cmDat(i), Type.GetType("System.String")) Case Else '整数型 TB.Columns.Add(cmDat(i), Type.GetType("System.Int16")) End Select Next Else '2行目以降のデータの設定 Dim cmDat() As String = Split(sr1.ReadLine, ",") ' "" で囲まれているデータは、"" を取り除く For i = LBound(cmDat) To UBound(cmDat) cmDat(i) = cmDat(i).Trim(Chr(34)) Next TB.Rows.Add(cmDat) End If Loop End Using 'データグリッドにテーブルを表示する DataGridView1.DataSource = TB 'Dim eTime0 As DateTime = Now '計測終了 'MessageBox.Show(eTime0.Subtract(sTime0).TotalSeconds & " 秒かかりました。") End Sub |
5.Excel ファイル(xls)を ADO.NET を使って DataGridView に読み込み表示 |
1.のコードに下記コードを追加して下さい。 Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click '05.Excel ファイル(xls)を ADO.NET を使って DataGridView に読み込み表示 DGVClear(DataGridView1) '初期化のSub プロシージャを Call Using cn As New System.Data.OleDb.OleDbConnection Using cm As New System.Data.OleDb.OleDbCommand Using da As New System.Data.OleDb.OleDbDataAdapter 'Excelファイルのフルパスを設定 Dim dbFileName As String = "..\..\..\data\dgvtest3.xls" 'Excelファイルのシート名を設定 Dim SheetName As String = "Sheet1" 'データベースに接続するための情報を設定する cn.ConnectionString = "provider=Microsoft.jet.OLEDB.4.0;Data source=" & _ dbFileName & ";Extended properties=""Excel 8.0;HDR=YES;IMEX=1""" 'コネクションの設定 cm.Connection = cn 'データソースで実行するSQL文の設定 cm.CommandText = "select * from [" & SheetName & "$]" '氏名に[子 or 正]の文字が含まれているデータを抽出して表示する場合 'cm.CommandText = "Select * from [" & SheetName & "$] WHERE 氏名 LIKE '%子%' or 氏名 LIKE '%正%'" 'データソース内のレコードを選択するためのSQLコマンドの設定 da.SelectCommand = cm Dim ds As New DataSet da.Fill(ds, SheetName) 'DataGridView に表示するデータソースを設定 DataGridView1.DataSource = ds.Tables(SheetName) End Using End Using End Using End Sub |
6.Excel ファイル(xlsx)を ADO.NET を使って DataGridView に読み込み表示 |
1.のコードに下記コードを追加して下さい。 Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click '06.Excel ファイル(xlsx)を ADO.NET を使って DataGridView に読み込み表示 DGVClear(DataGridView1) '初期化のSub プロシージャを Call Using cn As New System.Data.OleDb.OleDbConnection Using cm As New System.Data.OleDb.OleDbCommand Using da As New System.Data.OleDb.OleDbDataAdapter 'Excelファイルのフルパスを設定 Dim dbFileName As String = "..\..\..\data\dgvtest4.xlsx" 'Excelファイルのシート名を設定 Dim SheetName As String = "Sheet1" 'データベースに接続するための情報を設定する cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data source=" & _ dbFileName & ";Extended properties=""Excel 8.0;HDR=YES;IMEX=1""" 'コネクションの設定 cm.Connection = cn 'データソースで実行するSQL文の設定 cm.CommandText = "select * from [" & SheetName & "$]" '氏名に[子 or 正]の文字が含まれているデータを抽出して表示する場合 'cm.CommandText = "Select * from [" & SheetName & "$] WHERE 氏名 LIKE '%子%' or 氏名 LIKE '%正%'" 'データソース内のレコードを選択するためのSQLコマンドの設定 da.SelectCommand = cm Dim ds As New DataSet da.Fill(ds, SheetName) 'DataGridView に表示するデータソースを設定 DataGridView1.DataSource = ds.Tables(SheetName) End Using End Using End Using End Sub |
7.mdb ファイルを ADO.NET を使って DataGridView に読み込み表示 |
1.のコードに下記コードを追加して下さい。 Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click '07.mdb ファイルを ADO.NET を使って DataGridView に読み込み表示 DGVClear(DataGridView1) '初期化のSub プロシージャを Call Using cn As New System.Data.OleDb.OleDbConnection Using cm As New System.Data.OleDb.OleDbCommand Using da As New System.Data.OleDb.OleDbDataAdapter Dim ds As New DataSet 'EXE と同じフォルダーにデータも入れておく Dim dbFileName As String = "..\..\..\data\dgvtest5.mdb" Dim TableName As String = "Table1" '指定のテーブル名(上記ファイル内に存在する事) '接続文字列については、WEB上で、[接続文字列]をキーに検索して見て下さい。 cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & dbFileName & ";" 'パスワード等があれば続けて記入 'コネクションの設定 cm.Connection = cn 'データソースで実行するSQL文の設定 cm.CommandText = "SELECT * from " & TableName 'データソース内のレコードを選択するためのSQLコマンドの設定 da.SelectCommand = cm 'データを取得する da.Fill(ds, TableName) 'データグリッドに表示するデータソースを設定 DataGridView1.DataSource = ds 'グリッドを表示するための、DataSource 内のリストを設定 DataGridView1.DataMember = TableName 'データソースへの接続を閉る End Using End Using End Using End Sub |
8.accdb ファイルを ADO.NET を使って DataGridView に読み込み表示 |
1.のコードに下記コードを追加して下さい。 Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click '08.accdb ファイルを ADO.NET を使って DataGridView に読み込み表示 DGVClear(DataGridView1) '初期化のSub プロシージャを Call Using cn As New System.Data.OleDb.OleDbConnection Using cm As New System.Data.OleDb.OleDbCommand Using da As New System.Data.OleDb.OleDbDataAdapter Dim ds As New DataSet 'EXE と同じフォルダーにデータも入れておく Dim dbFileName As String = "..\..\..\data\dgvtest6.accdb" Dim TableName As String = "Table1" '指定のテーブル名(上記ファイル内に存在する事) '接続文字列については、WEB上で、[接続文字列]をキーに検索して見て下さい。 cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & dbFileName & ";" 'パスワード等があれば続けて記入 'コネクションの設定 cm.Connection = cn 'データソースで実行するSQL文の設定 cm.CommandText = "SELECT * from " & TableName 'データソース内のレコードを選択するためのSQLコマンドの設定 da.SelectCommand = cm 'データを取得する da.Fill(ds, TableName) 'データグリッドに表示するデータソースを設定 DataGridView1.DataSource = ds 'グリッドを表示するための、DataSource 内のリストを設定 DataGridView1.DataMember = TableName 'データソースへの接続を閉る End Using End Using End Using End Sub |
9.DataGridView に表示中のデータを CSV 形式で保存 |
1.のコードに下記コードを追加して下さい。 Private Sub Button9_Click(sender As Object, e As EventArgs) Handles Button9.Click '09.DataGridView に表示中のデータを CSV 形式で保存 CsvFileSave("saveTest1.csv") End Sub Private Sub CsvFileSave(ByVal SaveFileName As String) 'DataGridView に表示中のデータを CSV 形式で保存用のプロシージャ 'VB のソースコードのようなデータも保存できるように設定してあり、普通のCSVファイルも保存できます。 Dim dbFileName As String = SaveFileName '現在のファイルに上書き保存 Using swCsv As New System.IO.StreamWriter(dbFileName, False, System.Text.Encoding.GetEncoding("SHIFT_JIS")) Dim sf As String = Chr(34) 'データの前側の括り Dim se As String = Chr(34) & "," 'データの後ろの括りとデータの区切りの "," Dim i, j As Integer Dim WorkText As String = "" '1個分のデータ保持用 Dim LineText As String = "" '1列分のデータ保持用 With DataGridView1 'ヘッダー部分の取得・保存(保存する必要がなければいらない) For i = 0 To .Columns.Count - 1 WorkText = .Columns.Item(i).HeaderText If WorkText.IndexOf(Chr(34)) > -1 Then 'データ内に " があるか検索 WorkText = WorkText.Replace("""", """""") 'あれば " を "" に置換える End If If i = .Columns.Count - 1 Then 'ヘッダー行を列分連結 LineText &= sf & .Columns.Item(i).HeaderText & sf '最後の列の場合 Else LineText &= sf & .Columns.Item(i).HeaderText & se End If Next i swCsv.WriteLine(LineText) 'ヘッダーの部分の書き込み '最下部の新しい行(追加オプション)を非表示にする DataGridView1.AllowUserToAddRows = False '実データ部分の取得・保存処理 For i = 0 To .RowCount - 1 LineText = "" '1行分のデータをクリア For j = 0 To .Columns.Count - 1 '1行分のデータを取得処理 WorkText = .Item(j, i).Value.ToString '1個セルデータを取得 If WorkText.IndexOf(Chr(34)) > -1 Then 'データ内に " があるか検索 WorkText = WorkText.Replace("""", """""") 'あれば " を "" に置換える End If If j = .Columns.Count - 1 Then '1行分の列データを連結 LineText &= sf & WorkText & sf '最後の列の場合 Else LineText &= sf & WorkText & se End If Next j swCsv.WriteLine(LineText) '1行分のデータを書き込み Next i End With End Using MessageBox.Show("現在表示中のデータを " & dbFileName & " で保存しました。") End Sub |
10. |
11. |
12. |
13. |
検索キーワード及びサンプルコードの別名(機能名) |
データグリッドビュー |