DataGridViewで選択している行を取得する、SelectedRowsはかなりの頻度で利用するのですが、さらにSelectedRowsで取得できる行から、特定の行だけを抽出したい場合。
DataGridView.SelectedRowsをDataTableに変換して取り出す方法
DataTableに変換してから、Selectで抽出するという、とりあえず思いつく方法。
1 2 3 4 5 6 7 8 9 10 |
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"); <span>DataTable selectedTable = dr_array.CopyToDataTable()</span> |
こんな感じで、DataRowの配列として取り出します。
DataTable.Selectではなくて、LinQで取り出すなら
1 2 |
DataRow[] dr_array2 = dt.Rows.Cast<DataRow>().Where(dr => dr["check"].Equals((object)true)).ToArray(); DataTable selectedTable = dr_array.CopyToDataTable() |
って感じで。
DataGridView.SelectedRows から直接とりだす
DataTableに変換してからではなく、SelectedRowsから直接取り出すには、
1 2 |
DataGridViewRow[] rowList = dataGridView.SelectedRows.Cast<DataGridViewRow>() .Where(dr => dr.Cells["check"].Value.Equals((object)true)).ToArray(); |
とすれば、DataGridViewRowの配列で取り出せます。
比較のところは、Equalsメソッドを使ってますが、こんな風にしてもOK。
1 2 |
DataGridViewRow[] rowList = dataGridView.SelectedRows.Cast<DataGridViewRow>() .Where(dr => (bool)dr.Cells["check"].Value == true).ToArray(); |