C#根据gridview组合框更改gridview列数据?
Posted
技术标签:
【中文标题】C#根据gridview组合框更改gridview列数据?【英文标题】:C# change gridview column data according to gridview combobox? 【发布时间】:2016-04-29 14:56:35 【问题描述】:我正在尝试更改 datagridview 列中单元格的值,具体取决于同一 datagridview 中添加的组合框列中的选择。
我使用了各种 BindingSources,但似乎没有什么能完全正确。
我使用的代码是:
conn = new SqlConnection(DBConnectionString);
select_order = new SqlCommand("SELECT orderNum, orderBy, orderShipadrs, orderDate FROM tblOrders WHERE orderNum=" + OrderID, conn);
da1 = new SqlDataAdapter(select_order);
select_lines = new SqlCommand("SELECT linenum, fkprdctnum, lineQuantity, lineprdctPrice FROM tblOrderLines WHERE fkOrdernum=" + OrderID, conn);
da2 = new SqlDataAdapter(select_lines);
da2.MissingSchemaAction = MissingSchemaAction.AddWithKey;
select_products = new SqlCommand("SELECT * FROM tblProducts", conn);
da3 = new SqlDataAdapter(select_products);
Orders = new DataSet();
try
da1.Fill(Orders, Order);
da2.Fill(Orders, Lines);
da3.Fill(Orders, Products);
catch
MessageBox.Show("There was an error connecting to the database.");
DataRelation prdctprice = new DataRelation(Relations, Orders.Tables[Products].Columns["prdctNum"], Orders.Tables[Lines].Columns["fkPrdctnum"]);
Orders.Relations.Add(prdctprice);
CurrentOrder.DataSource = Orders.Tables[Order];
CurrentOrder.Columns["orderNum"].HeaderText = "Number";
CurrentOrder.Columns["orderNum"].Width = 50;
CurrentOrder.Columns["orderBy"].HeaderText = "Customer Name";
CurrentOrder.Columns["orderBy"].Width = 150;
CurrentOrder.Columns["orderShipadrs"].HeaderText = "Shipping Address";
CurrentOrder.Columns["orderShipadrs"].Width = 200;
CurrentOrder.Columns["orderDate"].HeaderText = "Order Date";
CurrentOrder.Columns["orderDate"].Width = 100;
//masterBindingSource.DataSource = Orders;
//masterBindingSource.DataMember = Products;
CurrentLine.DataSource = Orders.Tables["Lines"];
DataGridViewComboBoxColumn prod = new DataGridViewComboBoxColumn();
prod.DataSource = Orders.Tables[Products];
prod.DisplayMember = "prdctName";
prod.ValueMember = "prdctNum";
prod.HeaderText = "Product";
CurrentLine.Columns.Add(prod);
//detailBindingSource.DataSource = masterBindingSource;
//detailBindingSource.DataMember = Relations;
CurrentLine.Columns["fkPrdctnum"].Visible = false;
CurrentLine.Columns["linenum"].Width = 60;
CurrentLine.Columns["linenum"].HeaderText = "Number";
CurrentLine.Columns["linenum"].ReadOnly = true;
CurrentLine.Columns["lineQuantity"].HeaderText = "Quantity";
CurrentLine.Columns["lineQuantity"].Width = 70;
CurrentLine.Columns["linePrdctPrice"].HeaderText = "Price";
CurrentLine.Columns["linePrdctPrice"].ReadOnly = true;
只是为了让您有一个视觉效果,使其变得简单: 我希望“价格”列中的单元格根据“产品”组合框中的选择而改变。 组合框从数据集中名为“Products”的表中获取数据,而数据网格的其余部分从名为“Lines”的表中获取数据。
问题是,我唯一的选择是删除“价格”列并手动添加将随组合框更改的另一列吗?如果没有,我还有什么其他选择?
【问题讨论】:
不要打电话给DataGridView
a GridView
或DataGrid
!!这是错误的和令人困惑的,因为它们是不同的控件。始终以正确的名称称呼事物!是的,需要多输入 四个 字母。-至于您的问题:如果 DGV 是数据绑定的,您需要修改的不是 Cell,而是 DataSource。
我试过了,但是更改数据源会更改所有列,我只想更改一列。我认为除了手动添加另一列之外没有其他方法可以做到这一点?
【参考方案1】:
我之前没有在数据网格中使用过组合框,但是看看你是否可以在组合框索引的更改上有一个事件处理程序可能是个好主意,如果你可以这样做,然后使用它来更新每次更改时的数据网格。如果不可能,那么您可以将其作为一个单独的组合框,并在表单加载时用产品填充它,然后每次他们选择产品时,它都会更新网格视图以显示价格和数量。同样从个人视觉标准来看,我会在开头使用产品名称,但这是我个人的偏好。希望这有帮助。
【讨论】:
我可以捕捉到组合框的变化,但这不会做任何事情,因为到目前为止价格列根本没有连接到组合框。如果我找不到将价格列绑定到组合框列的方法,则更改组合框不会改变任何内容。 当您发现变化时,您应该能够运行一个根据产品设置价格的查询。您可以在更改时重新渲染 datagridview 以获得新值。因为如果你说你能够捕捉到组合框的变化,那么通过它来改变它应该很容易。据我所知,这是唯一的方法以上是关于C#根据gridview组合框更改gridview列数据?的主要内容,如果未能解决你的问题,请参考以下文章