プログラム

DataGridViewとDataTableの使用例と注意点|VB.NET

DataGridViewというExcelの表みたいなコントロールですが、地味に使うときが多かったりします。
編集も可能だったり、拡張ListBoxみたいな表示目的で使ったり。

データベースやCSVファイルから、DataGridViewまでに設定するまでの使用例とかをまとめてみましたので、ご参考ください。

概要

構成図

全体イメージを表すとこんな感じ。

各用語の解説

それぞれの用語について解説したいと思います。

・DataGridView

フォームコントロール(画面の見た目のコントロール)になります。Excelの表みたいな見た目です。

ひとまず、フォームコントロールで「列の追加」を行って外枠を作っておいてから、プログラム内でデータを設定していく流れになります。

データ設定の詳しい使い方などは、後半で解説します。

・DataTable

上記の図で見ると、DataGridViewと同じ形ですが^^;
違いは、DataGridViewのほうは、見た目がメインで、DataTableのほうは、データの中身がメインです。

DataTableは、一言でいうと二次元配列の変数みたいなものです。

SQLサーバのテーブルを丸々DataTableに設定することも可能です。

・DataRow

二次元配列でいうところの、1行分のデータを指します。

DataTableの中に、DataRowが複数行入っているイメージです。

・DataSet

Accessでいうところの、mdb/accdbファイル名。
SQLサーバでいうところの、データベース名。
にあたります。

DataSetの中には、DataTableが複数入っているイメージです。

テーブル単位でアクセスすることがほとんどだと思いますので、DataSetまで用意する事はなかなか無いと思います。

上記の絵では、Csvファイルを例にしておりますが、Csvファイルもある意味1つのテーブルデータになります。
もちろん「Csvファイル」の部分を「DBのテーブル」に置きかえても同様の意味です。

テーブル、レコード、カラムとは

それぞれの用語の意味は以下の通りです。この3つさえ理解できていたら、他の言語のデータベース管理も十分やっていけます。

  • テーブルとは、表データと同じ意味です。DataTableがまさにそれに当たります。
  • レコードとは、行データと同じ意味です。DataRowがまさにそれに当たります。
  • カラムとは、列データと同じ意味です。DataRowの左から何番目のデータといった意味と同じになります。

注意点と使用例

外部ファイルとのアクセスについて

外部ファイル(SQLサーバ、Access・CSVファイルなど)とのアクセス(読み書き)する事が、一番遅い処理となります。上記図でいうと、「DataTable←Csvファイル」のアクセス

そのため、この回数を少なくしたいところではあります。

例えば、更新(書込み/読込み)ボタンを用意して、ボタンを押したときしか、外部ファイルをアクセスさせないようにするとか工夫が必要です。

1カラムずつ変更するたびに外部ファイルもアクセスする方法では、データ量が少ないうちはそれでも良いかもしれませんが、データ量が膨大になると、遅すぎてストレスになってしまいます。

ほか、アプリ起動時のタイトル画面表示中に、DBからDataTableにまとめて全部取得するとかも、タイトル画面表示で少しごまかせるので良いかもしれません。^^;

内部データのアクセスについて

一方、DataTableからのデータ抽出は、パソコン内のメモリを使った処理となり速いので、何回データ処理(Select関数とか)を実行しても良いです。

上記図でいうと、DataTable~DataRowの間の処理とかになります。

DataGridViewは?と思うでしょうが、地味にクセがありまして、のちほど解説したいと思います。

話を戻して、DataTableからDataRowを取得する方法は以下のようにSelectメンバ関数で、レコード(1行データ)を抽出することもできます。

Dim strSQL As String
Dim drow() As DataRow

strSQL = "col1 = 2"
drow = dt.Select(strSQL)    'drowにcol1の値が2のレコードが格納されます

「dt」は、DataTable変数になります。
strSQLに、条件を入れることで、その条件と一致したレコード(DataRow)を取得することができます。
上記例では、”col1 = 2”とありますので、列名”col1″のデータが「2」と一致するレコードを取得します。

条件があれば、複数行のデータが取れることもありますし、1件も見つからなければ、データが0件の場合もあります。

DataGridViewの使用例

使用例を以下にまとめてみましたので、ご参考ください。

データの追加方法

VB.netでのサンプルになります。
C#もメンバ変数・関数は同じなので、文法だけ気を付ければ移植は容易です。

設定方法は3パターンを用意しました。

パターン①:行追加後、値を設定(悪い例)
For i = 0 To 5
    '行追加
    Me.DataGridView1.Rows.Add()
    '各列の値設定
    Me.DataGridView1.Rows(i).Cells(0).Value = CStr(i)
    Me.DataGridView1.Rows(i).Cells(1).Value = CStr(i) + CStr(i)
    Me.DataGridView1.Rows(i).Cells(2).Value = CStr(i) + CStr(i) + CStr(i)
    Me.DataGridView1.Rows(i).Cells(3).Value = CStr(i) + CStr(i) + CStr(i) + CStr(i)
    Me.DataGridView1.Rows(i).Cells(4).Value = CStr(i) + CStr(i) + CStr(i) + CStr(i) + CStr(i)
Next
パターン②:行追加時、一緒に値も指定1
For i = 0 To 5
    Me.DataGridView1.Rows.Add(CStr(i), _
        CStr(i) + CStr(i), _
        CStr(i) + CStr(i) + CStr(i), _
        CStr(i) + CStr(i) + CStr(i) + CStr(i), _
        CStr(i) + CStr(i) + CStr(i) + CStr(i) + CStr(i))
Next

'やっていることは、以下と同じ。
'Me.DataGridView1.Rows.Add("0", "00", "000", "0000", "00000")
'Me.DataGridView1.Rows.Add("1", "11", "111", "1111", "11111")
'Me.DataGridView1.Rows.Add("2", "22", "222", "2222", "22222")
'Me.DataGridView1.Rows.Add("3", "33", "333", "3333", "33333")
'Me.DataGridView1.Rows.Add("4", "44", "444", "4444", "44444")
'Me.DataGridView1.Rows.Add("5", "55", "555", "5555", "55555")
パターン③行追加時、一緒に値も指定2
    Dim dt As New DataTable
    Dim drow As DataRow

    'テーブル名設定
    dt.TableName = "testtable"
    'カラム名設定
    dt.Columns.Add("col1")
    dt.Columns.Add("col2")
    dt.Columns.Add("col3")
    dt.Columns.Add("col4")
    dt.Columns.Add("col5")
    '行設定
    For i = 0 To 5
        drow = dt.NewRow
        drow("col1") = CStr(i)
        drow("col2") = CStr(i) + CStr(i)
        drow("col3") = CStr(i) + CStr(i) + CStr(i)
        drow("col4") = CStr(i) + CStr(i) + CStr(i) + CStr(i)
        drow("col5") = CStr(i) + CStr(i) + CStr(i) + CStr(i) + CStr(i)
        dt.Rows.Add(drow)
    Next
    'DataGridViewに追加
    For i = 0 To 5
        Me.DataGridView1.Rows.Add(dt.Rows(i).Item(0), _
                               dt.Rows(i).Item(1), _
                               dt.Rows(i).Item(2), _
                               dt.Rows(i).Item(3), _
                               dt.Rows(i).Item(4))
    Next

パターン②③のようにAddメンバ関数の引数に出来るだけ値を渡してあげると良いです。
パターン①の場合、1行追加したあとに5回代入とパターン②③と比べると処理が多い扱いとなり、データ量が多くなると目に見えて遅くなるためです。

※パターン①よりパターン③のほうが、ごちゃごちゃしているから遅いんじゃないの?と思うかもしれませんが、ループ回数を5→1000とかにして動かすと、やはりパターン①が一番遅い結果となります。

列/行幅自動調整

「列/行幅自動調整」を有効にした状態で、追加・編集を行うと、超遅くなります。
DataGridViewのデータを更新する際は、無効(None)を設定してから行いましょう。

'Me.DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
'Me.DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
'Me.DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None
'Me.DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None

行選択にしたい場合

DataGridViewで、リストボックス的な使い方をしたいときに、設定する内容になります。
ソースコード上でなく、フォームプロパティで変更してもOKです。

Me.DataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect

複数選択できないようにしたい場合

こちらも、リストボックス的な使い方で使用したいときに設定する内容になります。
ソースコード上でなく、フォームプロパティで変更してもOKです。

Me.DataGridView.MultiSelect = False

最後に

DataGridViewは、画面の見た目のコントロールになりますが、リストボックスに列の項目を付け足したような使い方をしたいときがありますので、地味に使う機会が多かったりします。

しかしリストボックスは行データのみに対し、DataGridViewは、さらに列データも付加されるので、ちょっと面倒なイメージもあります。

毎回使うたびに、「あれ?どうやって使うんだっけ?」と思っていたものです。^^;

本記事が少しでもご参考になれたら幸いでございます。

最後まで見てくれてありがとう。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA