Categories: C#

DataGridViewの変更をDataTableに反映させる

DataGridViewに次のようにチェックボックスを作ってあるとします。

            DataColumn _dc1 = new DataColumn("check", typeof(bool));
            DataColumn _dc2 = new DataColumn("name", typeof(string));
            DataColumn _dc3 = new DataColumn("age", typeof(uint));
            DataTable _dt = new DataTable();
            _dt.Columns.Add(_dc1);
            _dt.Columns.Add(_dc2);
            _dt.Columns.Add(_dc3);
            DataGridView dgv = new DataGridView();

            DataRow _dr = _dt.NewRow();
            _dr["name"] = "本田";
            _dr["age"] = 31;
            _dt.Rows.Add(_dr);

            _dr["name"] = "香川";
            _dr["age"] = 28;
            _dt.Rows.Add(_dr);

            _dr["name"] = "長友";
            _dr["age"] = 30;
            _dt.Rows.Add(_dr);
            
            _dr["name"] = "吉田";
            _dr["age"] = 28;
            _dt.Rows.Add(_dr);

            dgv.DataSource = _dt;

で、DataGridViewに表示されたチェックボックスをつけたあとに、次のように取得しようとしても、最後にチェックしたひとつが取得できていません。

            DataRow[] _selected_rows 
                = ((DataTable)dgv.DataSource).Select("check=true");

そこで、登場するのがEndEdit()。

DataGridViewを操作し始めると、自動的にBigenEdit()メソッドが呼び出されているらしく、それを終わらせるためにEndEdit()を呼び出さないといけないそうです。

というわけで、DataGridViewと、バインドされているDataSourceのDataRowViewでEndEdit()メソッドを実行すればいいと。

            dgv.EndEdit();
            ((DataRowView)dgv.CurrentRow.DataBoundItem).EndEdit();


            DataRow[] _selected_rows 
                = ((DataTable)dataGridView_dataList.DataSource).Select("check=true");
nakaike