0

ComboBox を DataGridView に追加しました

DBAccess dba = new DBAccess();
DataTable dt = dba.spGetASTMTable(); // Getting Data from DataBase for Grid
DataTable dtOrders = dba.spGetOrdersList(); / Getting Data from DataBase for ComboBox
// Create ComboBox
var cboDbTableColumn = new DataGridViewComboBoxColumn();
cboDbTableColumn.DataSource = dtOrders;
cboDbTableColumn.DataPropertyName = "OrdersID";
cboDbTableColumn.DisplayMember = "Orders";
cboDbTableColumn.HeaderText = "DbTableColumn";

gvASTMOrderMessage.Columns.Add(cboDbTableColumn);

gvASTMOrderMessage.DataSource = dt;

次に、アプリを実行して、いくつかの ComboBoxes を変更します。「保存」ボタンをクリックして、すべての DataGridView データを含む DataTable を取得します。私が理解しているように、ComboBox は DataSource の一部にあるため、Grid 全体をループし、ComboBox の値を DataTable に手動で追加する必要があります。ここでこのステップを実行しようとしています:

private void btnSave_Click(object sender, EventArgs e)
{
     DataTable data = (DataTable)(gvASTMOrderMessage.DataSource);
     data.Columns.Add("DbTableColumn");
     for (int i = 0; i < gvASTMOrderMessage.Rows.Count; i++)
     {
         data.Rows[i]["DbTableColumn"] = Convert.ToString((gvASTMOrderMessage.Rows[i].Cells[0] as DataGridViewComboBoxCell).FormattedValue.ToString());
     }
} 

しかし、これはうまくいきません。私は取得しようとしました

gvASTMOrderMessage.Rows[i].Cells[0].FormattedValue.ToString()
gvASTMOrderMessage.Rows[i].Cells[0].Value.ToString()
gvASTMOrderMessage.Rows[i].Cells[0].EditedFormattedValue.ToString()

しかし、これは何も機能しません...

DataGridView からすべてのコンボボックスのすべての値を取得し、それらを DataTable に追加する方法を教えてください。

4

3 に答える 3

1

DataSourceDataGridViewは、何らかの形で調整された 2 つの異なるオブジェクトです。しかし、この調整は完全ではなく、実際には簡単に問題が発生する可能性があります ( から要素を削除し、DataSourceからそれらのインデックスにアクセスするDataGridView)。そのため、私は常に両方のオブジェクトに同時に影響を与えることを好みます (DataSourceDataGridView)。

いずれにせよ、 で実行したかなりの数の変更DataGridView(例: 列の追加/削除) は に自動的に反映されないことに注意してDataSourceください (逆に発生する可能性もあります)。DataGridViewComboBoxColumnあなたの特定の状況では、型列をDataSource(おそらく a 、おそらく他のオブジェクト)に含めることを自動化することが事実上不可能である限り、この動作はさらに理にかなっていますDataTable(多くの選択肢があり、他よりも客観的に優れている人はいません)。

コンボボックスを自分に合わせる方法を考え出す必要がありますDataTable(たとえば、指定された列にコンボボックス内のアイテムと同じ数の行を入力し、この列を何らかの方法で「マーク」します)、対応する更新アクションを実行するコードを実装する必要があります。必要。

于 2013-11-02T18:19:07.707 に答える