DataGridViewで選択している行を取得する、SelectedRowsはかなりの頻度で利用するのですが、さらにSelectedRowsで取得できる行から、特定の行だけを抽出したい場合。
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()
って感じで。
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();