Categories: C#

C# DataGridViewのSelectedRowsをDataTableで取得する

DataGridViewで選択している行を取得する、SelectedRowsはかなりの頻度で利用するのですが、さらにSelectedRowsで取得できる行から、特定の行だけを抽出したい場合。

DataGridView.SelectedRowsをDataTableに変換して取り出す方法

DataTableに変換してから、Selectで抽出するという、とりあえず思いつく方法。

DataTable dt = ((DataTable)dataGridView.DataSource).Clone();
foreach (DataGridViewRow row in dataGridView.SelectedRows)
{
    dt.ImportRow(((DataTable)dataGridView.DataSource).Rows[row.Index]);
}
//ここまでで、選択した行がdtに入っている

//ここから、dataGridViewの「check」列のチェックボックスにチェックが入っている行だけを取り出す
DataRow[] dr_array = dt.Select("check=true");
DataTable selectedTable = dr_array.CopyToDataTable()

こんな感じで、DataRowの配列として取り出します。

DataTable.Selectではなくて、LinQで取り出すなら

DataRow[] dr_array2 = dt.Rows.Cast().Where(dr => dr["check"].Equals((object)true)).ToArray();
DataTable selectedTable = dr_array.CopyToDataTable()

って感じで。

 

DataGridView.SelectedRows から直接とりだす

DataTableに変換してからではなく、SelectedRowsから直接取り出すには、

DataGridViewRow[] rowList = dataGridView.SelectedRows.Cast()
                .Where(dr => dr.Cells["check"].Value.Equals((object)true)).ToArray();

とすれば、DataGridViewRowの配列で取り出せます。

比較のところは、Equalsメソッドを使ってますが、こんな風にしてもOK。

DataGridViewRow[] rowList = dataGridView.SelectedRows.Cast()
                .Where(dr => (bool)dr.Cells["check"].Value == true).ToArray();
nakaike

Share
Published by
nakaike