我在我的DataGridView
中添加了一个ComboBoxDBAccess 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?
答案 0 :(得分:1)
DataSource
和DataGridView
是两个不同的对象,它们以某种方式协调。但这种协调并不完美,实际上很容易引发问题(删除DataSource
中的元素并从DataGridView
访问这些索引)。这就是为什么我总是喜欢同时影响两个对象(DataSource
和DataGridView
)。
在任何情况下,请记住,您在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;
}