如何从我的DataGridView获取每个组合框的所有值并将它们添加到DataTable?

时间:2013-11-02 16:46:36

标签: c# datagridview combobox datatable

我在我的DataGridView

中添加了一个ComboBox
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?

3 个答案:

答案 0 :(得分:1)

DataSourceDataGridView是两个不同的对象,它们以某种方式协调。但这种协调并不完美,实际上很容易引发问题(删除DataSource中的元素并从DataGridView访问这些索引)。这就是为什么我总是喜欢同时影响两个对象(DataSourceDataGridView)。

在任何情况下,请记住,您在DataGridView中执行的很多更改(例如,添加/删除列)不会自动反映在DataSource中(尽管可能会反向发生) 。在您的特定情况下,就自动将DataGridViewComboBoxColumn类型列包含到DataSource(可能是DataTable,可能是其他对象)而言,这种行为更有意义。 (许多替代品,没有人客观上比其他人更好)。

您应该想出一种方法将组合框放入DataTable(例如:在给定列中填充与组合框中的项目一样多的行,并以某种方式“标记”此列)并实现代码在需要时执行相应的更新操作。

答案 1 :(得分:0)

好吧,你应该检查一下

DataTable data = (DataTable)(gvASTMOrderMessage.DataSource);

检查数据表是否为空(我的是)。其余代码似乎也没问题 检查

  

data.Rows [i] [“DbTableColumn”] = Convert.ToString((gvASTMOrderMessage.Rows [i] .Cells [0] as DataGridViewComboBoxCell).FormattedValue.ToString());        }

我会做类似

的事情
DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)dataGridView1.Rows[i].Cells[0];
                data.Rows[i]["DbTableColumn"] = cell.FormattedValue.ToString());

这是一个更易读的版本。

希望这有帮助!

答案 2 :(得分:0)

也许我不明白,但看下面的代码: 我添加了额外的“ComboID”列,在gridview中选择了项目并单击“保存”按钮后,数据表将包含组合中的ID。

    private void Form1_Load(object sender, EventArgs e)
    {
        var dt = new DataTable();
        dt.Columns.Add("Id");
        dt.Columns.Add("Value");
        dt.Columns.Add("ComboID");

        var drow = dt.NewRow();
        drow[0] = 10;
        drow[1] = "abc";
        dt.Rows.Add(drow);

        drow = dt.NewRow();
        drow[0] = 20;
        drow[1] = "xy";
        dt.Rows.Add(drow);

        dataGridView1.AutoGenerateColumns = false;
        dataGridView1.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "Id" });
        dataGridView1.Columns.Add(new DataGridViewTextBoxColumn { DataPropertyName = "Value" });

        var dtOrders = new DataTable();
        dtOrders.Columns.Add("OrdersID");
        dtOrders.Columns.Add("Orders");

        drow = dtOrders.NewRow();
        drow[0] = 1;
        drow[1] = "Order1";
        dtOrders.Rows.Add(drow);

        drow = dtOrders.NewRow();
        drow[0] = 2;
        drow[1] = "Order2";
        dtOrders.Rows.Add(drow);

        var combo = new DataGridViewComboBoxColumn();
        combo.DataSource = dtOrders;
        combo.DataPropertyName = "ComboID";
        combo.ValueMember = "OrdersID";
        combo.DisplayMember = "Orders";
        dataGridView1.Columns.Add(combo);

        dataGridView1.DataSource = dt;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        var dt = dataGridView1.DataSource as DataTable;
    }