VB.NET Datatable 指定した行を削除する RemoveAt

今回は、VB.NETを利用した、Datatableの指定行の削除方法を紹介していきます。

不必要な行を削除し、必要な行のみのDatatableを作成できるようになりましょう。

そもそも、Datatableってなに??って人はこちらを参考にしてみてください。

指定した行を削除

Datatableの指定した行を削除するには、RemoveAtを利用しましょう。

datatable.Rows.RemoveAt(行インデックス)

行インデックスには削除したい行を入力することで、削除できます。

1行目は、0から始まるので、「RemoveAt(0)」と指定することで削除することができます。

datatable.Rows.RemoveAt(0)

やり方はとても簡単ですね。

ただ、1点注意点があるので紹介しておきます。

Datatable 行の削除 注意点

RemoveAtを行うとDatatableのインデックスが振りなおされるので注意しましょう。

言葉だけだとわかりにくいので例を紹介していきます。

 

下記のような10行のDatatableが存在しています。

このDatatableの「old=10」の行を消してみましょう。

下記は間違った例

For rowindex As Integer = 0 To dt.Rows.Count - 1
    If dt.Rows(rowindex).Item("old") = "10" Then
        dt.Rows.RemoveAt(rowindex)
    End If
Next

結果

解説
今回は、if文で「old=10」を削除したつもりが、エラーが発生していますね。

これは、指定した行を削除した時にインデックスが振りなおされているから発生しています。

今回の例の場合、「rowindex=0」つまりRemoveAt(0)で1行目を削除した時、で「height=100」の行が削除されますが、

削除した後、「height=110」のインデックスが0になります。

次のループの際「rowindex=1」つまりRemoveAt(1)で削除する行が、「height=110」ではなく「height=120」が削除されることになり、

「height=110」は残ったままになります。なので、RemoveAtを使うときは、インデックスが振りなおされることに注意しましょう。

for文は、10回(0から9まで)ループするが、インデックスが振りなおされて、インデックス(7)でエラーが発生しています。

 

ちなみに今回の例のようにfor文を利用して削除する場合は、インデックスが大きい行から削除することで解決できます。
参考までに、解決策を載せておきます。

For rowindex As Integer = dt.Rows.Count - 1 To 0 Step -1
    If dt.Rows(rowindex)("old") = "10" Then
        dt.Rows.RemoveAt(rowindex)
    End If
Next

結果

解説

インデックスが9のデータから判定し、Step-1にすることで減算することができ、インデックスを0まで判定していきます。

このやり方の場合、インデックスが変更されても問題ありませんね。

この考え方は、配列などなどいろんなことに応用できるので、覚えておくと便利かもしれないです。

サンプルソース

Private Sub frmdatatable_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    'データテーブル作成
    Dim dt As New DataTable
    dt.Columns.Add("name")
    dt.Columns.Add("old")
    dt.Columns.Add("height")

    Dim dtRow As DataRow

    For i As Integer = 0 To 9

        dtRow = dt.NewRow()
        dtRow("name") = "ひろにも"

        If i < 5 Then
            dtRow("old") = "10"
        Else
            dtRow("old") = "20"
        End If
        dtRow("height") = (100 + 10 * i)
        dt.Rows.Add(dtRow)

    Next

    '★行削除
    For rowindex As Integer = dt.Rows.Count - 1 To 0 Step -1
        If dt.Rows(rowindex)("old") = "10" Then
            dt.Rows.RemoveAt(rowindex)
        End If
    Next

    '結果表示
    For rowindex As Integer = 0 To dt.Rows.Count - 1
        For colindex As Integer = 0 To dt.Columns.Count - 1
            Console.Write(dt.Rows(rowindex)(colindex))
        Next
        Console.WriteLine()
    Next

End Sub

 

まとめ

今回は、Datableの指定行を削除する方法を紹介しました。

datatable.Rows.RemoveAt(行インデックス)

Datatableを加工したい時に使うので、是非覚えておきましょう。

また、削除するとインデックスが変わるので注してくださいね。

 

VB.NETの記事一覧

おすすめの記事