Back to Top

Daily Archives: 2016年3月24日

VB.NETのDataTable行(Rows)

DataTableで使用する行(Rows)の操作説明をします。

行を追加します

任意の行に追加する場合はInsertAtを使用します。

Dim tbl As DataTable = New DataTable("table1")

tbl.Columns.Add("Item1")
tbl.Columns.Add("Item2")
tbl.Columns.Add("Item3")


Dim row As DataRow

'1列目
row = tbl.NewRow
row("Item1") = "A1"
row("Item2") = "A2"
row("Item3") = "A3"
tbl.Rows.Add(row)

'2列目
row = tbl.NewRow
row("Item1") = "B1"
row("Item2") = "B2"
row("Item3") = "B3"
tbl.Rows.Add(row)

'途中挿入
row = tbl.NewRow
row("Item1") = "C1"
row("Item2") = "C2"
row("Item3") = "C3"
tbl.Rows.InsertAt(row, 1)

 

オブジェクトのインデックスを取得します

Dim no As Integer = tbl.Rows.IndexOf(row)
MessageBox.Show(no.ToString)

 

行を削除します

DataRowの削除する方法RemoveとDeleteの二つあります。
RemoveメソッドはDataRowCollectionからDataRowを削除します。
Deleteメソッドは削除対象の行をマークします。(実際に削除しません)

'位置指定による削除
tbl.Rows.RemoveAt(0)

'オブジェクト指定による削除
tbl.Rows.Remove(row)

'削除フラグを付ける
tbl.Rows(0).Delete()

※DataViewを使用している場合、Deleteにより削除した場合、DataRowCollection.CountとDataView.Countの結果に違いが出ます。
 

行数を取得する

 MessageBox.Show(tbl.Rows.Count.ToString)

 

行でループ

Dim s As String
For Each drow As DataRow In tbl.Rows
    s &= drow("Item1").ToString & System.Environment.NewLine
Next
MessageBox.Show(s)

 

データを抽出する

抽出にはSelectを使用します。SelectのパラメータはSQL文です。
Dim dr() As DataRow = DataTable.Select(“カラム名 = 値”)
Dim dr() As DataRow = DataTable.Select(“カラム名 = 値”, “カラム名 ASC または カラム名 DESC”)
戻り値は、DataRow型の配列を返します。

'インデックスを作成
tbl.DefaultView.Sort = "Item1"

'データの抽出
Dim dr() As DataRow = tbl.Select("Item1 = 'C1'", "Item1 ASC")

必ずしもインデックスを作成する必要はありません。

インデックスを作成すると抽出速度は上がりますが、インデックスを作成する時間がかかります。
 

編集処理

DataRowの複数カラムの値を更新する際に、BeginEditとEndEditメソッドで囲むことで速くなります。

Dim tbl As DataTable = New DataTable("table1")
Dim row As DataRow

tbl.Columns.Add("Item1")
tbl.Columns.Add("Item2")

'1列目
row = tbl.NewRow
row("Item1") = "A1"
row("Item2") = "A2"
tbl.Rows.Add(row)

'2列目
row = tbl.NewRow
row("Item1") = "B1"
row("Item2") = "B2"
tbl.Rows.Add(row)

'3列目
row = tbl.NewRow
row("Item1") = "C1"
row("Item2") = "C2"
tbl.Rows.Add(row)

For Each drow As DataRow In tbl.Rows
    'オブジェクトの編集開始
    drow.BeginEdit()

    drow("Item2") = "AAAAA"

    'オブジェクトの編集終了
    drow.EndEdit()
Next

'変更を反映する
tbl.AcceptChanges()

Dim s As String = ""
For Each drow As DataRow In tbl.Rows
    s &= drow("Item2").ToString & System.Environment.NewLine
Next
MessageBox.Show(s)

 

VB.NETハッシュテーブル(連想配列)

ハッシュテーブルは、キーと値を保持しているコレクションです。

値は文字列型・数値型・オブジェクト型の様々なデータを保持できます。

キーは文字列扱いで、値はオブジェクト扱いなので値を取り出すときはキャストします。

使用するには、Imports System.Collectionsを追加します。

項目を追加する

Dim hTbl As New Hashtable()

'文字列型の場合
hTbl.Add("H", "平成")
hTbl.Add("S", "昭和")
hTbl.Add("M", "明治")
hTbl.Add("T", "大正")


'数値型の場合
hTbl.Add("H", 100)
hTbl.Add("S", 200)
hTbl.Add("M", 300)
hTbl.Add("T", 400)

キーや値の存在チェック

ContainsValueメソッドおよびContainsKeyメソッド、存在チェックをする。

'値が存在すれば、Trueを、存在しなければ、Falseを返します。
If hTbl.ContainsValue("昭和") Then
    MessageBox.Show("値は存在します")
End If

'値が存在すれば、Trueを、存在しなければ、Falseを返します。
If hTbl.ContainsKey("H") Then
    MessageBox.Show("キーは存在します")
End If

テーブル内の値の取得する

値取得にはキャストをします。

文字列の場合
Dim str1 As String = CStr(hTbl("H"))
または
Dim str1 As String = CType(hTbl(H"), String)

数値の場合
Dim val1 As Integer = CInt(hTbl("H"))
または
Dim val1 As Integer = CType(hTbl("H"), Integer)

テーブルのループ

Dim hTbl As New Hashtable()

'文字列型
hTbl.Add("H", "平成")
hTbl.Add("S", "昭和")
hTbl.Add("M", "明治")
hTbl.Add("T", "大正")

Dim s As String = ""

'キーによるループ
For Each key As String In hTbl.Keys
    s &= String.Format("{0}:{1}", key, hTbl(key)) & System.Environment.NewLine
Next
MessageBox.Show(s)

'値によるループ
For Each val As String In hTbl.Values
    s &= String.Format("{0}", val) & System.Environment.NewLine
Next
MessageBox.Show(s)

'テーブルのループ
For Each de As DictionaryEntry In hTbl
    s &= String.Format("{0}:{1}", de.Key, de.Value) & System.Environment.NewLine
Next
MessageBox.Show(s)