C# Datatable 指定した行を削除する RemoveAt

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

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

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

指定した行を削除

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

datatable.Rows.RemoveAt(行数);

行数には削除したい行を入力することで、削除できます。

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

datatable.Rows.RemoveAt(0);

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

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

注意点

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

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

 

下記のような10行のDatatableが存在しています。
このDatatableの「old=10」の行を消してみましょう。

下記は間違った例

for (int rowindex = 0; rowindex < dt.Rows.Count; rowindex++)
{
    if (dt.Rows[rowindex]["old"].ToString() == "10")
    {
        dt.Rows.RemoveAt(rowindex);
    }
}

 

結果

解説
今回は、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文を利用して削除する場合は、下の行から削除することで解決できます。
参考までに、解決策を載せておきます。

for (int rowindex = dt.Rows.Count - 1; rowindex >= 0; rowindex--)
{
    if (dt.Rows[rowindex]["old"].ToString() == "10")
    {
        dt.Rows.RemoveAt(rowindex);
    }
}

 

サンプルソース

private void datatableRemoveat_Load(object sender, EventArgs e)
{
    //データテーブル作成
    DataTable dt = new DataTable();
    dt.Columns.Add("name");
    dt.Columns.Add("old");
    dt.Columns.Add("height");

    DataRow dtRow;

    //データを作成
    for (int i = 0; i < 10; i++)
    {
        dtRow = dt.NewRow();
        dtRow["name"] = "ひろにも";
        if (i < 5)
        {
            dtRow["old"] = "10";
        }
        else
        {
            dtRow["old"] = "20";
        }
        dtRow["height"] = (100 + 10 * i);

        dt.Rows.Add(dtRow);
    }


    //★指定した行を削除する
    for (int rowindex = dt.Rows.Count - 1; rowindex >= 0; rowindex--)
    {
        if (dt.Rows[rowindex]["old"].ToString() == "10")
        {
            dt.Rows.RemoveAt(rowindex);
        }
    }


    //結果出力
    for (int rowindex = 0; rowindex < dt.Rows.Count; rowindex++)
    {
        for (int colindex = 0; colindex < dt.Rows[rowindex].ItemArray.Length; colindex++)
        {
            Console.Write(dt.Rows[rowindex][colindex] + " ");
        }
        Console.WriteLine();
    }

}

 

結果

まとめ

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

datatable.Rows.RemoveAt(行数);

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

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

 

C#の記事一覧

おすすめの記事