[英]How to get all values of every combobox from my DataGridView and Add them to 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;
然后,我运行我的应用程序并更改几个组合框。 我单击按钮“保存”,我想获取包含所有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?
DataSource
和DataGridView
是两个不同的对象,它们以某种方式进行了协调。 但是这种协调并不是完美的,实际上,很容易引发问题(从DataSource
删除元素并从DataGridView
访问那些索引)。 这就是为什么,我总是喜欢同时影响两个对象( DataSource
和DataGridView
)。
无论如何,请记住,您在DataGridView
执行的许多更改(例如,添加/删除列)不会自动反映在DataSource
(尽管它可以相反地发生)。 在您的特定情况下,从自动将DataGridViewComboBoxColumn
类型的列自动包含到DataSource
(也许是一个DataTable
,也许是其他对象)到实际上将是不可能的(许多替代方法,在客观上没有一个优于其他方法) 。
您应该想出一种方法来使组合框适合您的DataTable
(例如:在给定列中填充与组合框中的项目一样多的行,并以某种方式“标记”该列)并实现执行相应更新操作的代码在需要的时候。
好吧,你应该检查
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());
这是更具可读性的版本。
希望这可以帮助!
也许我不明白,但是看下面的代码:我添加了额外的“ 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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.