[C#] DataGridViewでコンボボックスでの変更がdataTableに反映されません
DataGridViewへのコンボボックス利用で躓いております。
DataGridViewのAutoGenerateColumnsをfalseにし、dataGridView.DataSourceにデータベースから読み込んだデータテーブルを指定しています。
次にdataGridViewにDataGridViewComboBoxColumnを追加し、DataPropertyNameにコンボボックスに対応させたい
データテーブルのCaptionを指定することで、データテーブルとコンボボックスを関連付けています。
実行後の表示は想定通りなのですが、コンボボックスでアイテムを選択するとdataGridView上では値が更新されて、データテーブルには変更が反映されていません。
ちなみにコンボボックスでは、ValueMemberとDisplayMemberを設定し、DataGridView上ではstring、
内部的にはlongでデータ管理を行いたいと思っています。
どうにも解決方法が見いだせないので、こちらに質問させていただきました。
ソースを貼りつけるのでご指摘をお願いします。
利用しているデータベース
|ID|ペットID|
|1 |1|
|2 |1|
|3 |3|
以下ソースでは上記データベースのデータテーブルをpdtとしています。
コンボボックスのデータテーブル作成
DataTable comboTable = new DataTable();
comboTable.Columns.Add("ID", typeof(long));
comboTable.Columns.Add("NAME", typeof(string));
string[,] rowDataArray =
{{"1", "犬"},
{"2", "猫"},
{"3", "魚"}};
for(i=0;i<rowDataArray.GetLength(0);i++)
{
DataRow row = comboTable.NewRow();
row["ID"] = rowDataArray[i, 0];
row["NAME"] = rowDataArray[i, 1];
comboTable.Rows.Add(row);
}
comboTable.AcceptChanges();
//コンボボックスを作成しコンボボックステーブルをバインド
DataGridViewComboBoxColumn cbc = new DataGridViewComboBoxColumn();
cbc.DataSource = comboTable;
cbc.DisplayMember = "NAME";
cbc.ValueMember = "ID";
cbc.DataPropertyName = pdt.ペットIDColumn.Caption;
cbc.DisplayStyleForCurrentCellOnly = true;
//dataGridViewにデータテーブルをバインド
dataGridView1.AutoGenerateColumns = false;
dataGridView1.DataSource = pdt;
dataGridView1.Columns.Add(cbc);
これを実行すると
|犬|
|犬|
|魚|
とdataGridViewに表示され、コンボボックスでは、犬、猫、魚が選べます。
一行目において、コンボボックスから猫を選択するとdataGridViewは下記のようになるのですが
|猫|
|犬|
|魚|
この後ブレークよりデータテーブルとdataGridViewを見ると
pdt[0][0] = 1
dataGridView1.Rows[0].Cells[0].Value = 2
となっており、dataGridViewの値は更新されているのに、データテーブルでは更新されていませんでした。
今まで、dataGridView上でダブルクリックし、値を直接書き換えていたらデータテーブルの値も更新されていたのですが、
コンボボックスを使うようにしたら更新されなくなりました。
皆様、解決方法を教えていただけますでしょうか。
補足
(1)ソートキーはあっています。 他のサイトを見たところ、DataTableをコピーし、ソートしたものを元のDataTableに反映させる方法が多いみたいです。 その際、データ量が増えていくにつれて処理速度が重くなると思われ、ましてグリッドが5つあるので実用には向かないと考えております。 (2)ユーザー編集可能行とプログラムのみ編集可能行が混合しているので、EditModeを使うかと思います。 また、XMLやCSV形式でデータを保存しても、ユーザーが編集しやすい文字で出力されるので、あまり好ましくありません。 バイナリなどある程度暗号化された形式で保存したいと考えております。それこそ、出力されたファイルにロックをかけるような堅固な造りにしたいです。