2016-04-29 60 views
0

我想要更改datagridview列中单元格的值,具体取决于同一个datagridview中添加的组合框列中的选择。C#根据gridview组合框更改gridview列数据?

我有各种各样的BindingSources twiked,但似乎没有得到它很正确。

我正在使用的代码是:

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; 

只要你有一个直观,可以很容易: 我想在“价格”列的单元格取决于选择的改变“产品“组合框。 组合框从数据集的一个表中获取数据,称为“产品”,而其余的数据网格则从名为“行”的表中获取数据。

问题是,是我唯一的选择删除“价格”列并手动添加另一列将随组合框更改吗?如果不是,我还有什么其他选择?

Windows Form Window

+0

__不调用'DataGridView'''GridView'或'DataGrid'!这是错误的和混乱的,因为这些是不同的控制。总是用__right__的名字打电话给他们!是的,它需要更多__four__字母来输入.. - 至于你的问题:如果DGV是数据绑定的,你需要修改单元格而不是数据源。 – TaW

+0

我尝试过,但更改DataSource更改了所有列,我只想要更改一列。 我认为没有办法做到这一点,除了手动添加另一列? –

回答

1

我没有在数据网格中使用组合框之前,但它可能是一个好主意,看看你是否可以对组合框指标的变化的事件处理程序,如果你能做到这一点然后使用它在每次更改时更新数据网格。如果不可能,那么您可以将其作为单独的组合框来使用,并在表单加载时将其填充到产品中,然后每次选择产品时都会更新网格视图以显示价格和数量。另外从个人的视觉标准来看,我会在开始时提供产品名称,但那是我个人的偏好。希望这有助于。

+0

我可以捕获组合框的变化,但是这样做还没有做任何事情,因为到目前为止价格栏根本没有连接到组合框。如果我找不到将价格列绑定到组合框列的方法,更改组合框不会改变任何内容。 –

+0

当您发现更改时,您应该能够运行基于产品设置价格的查询。您可以在更改时重新呈现datagridview以获取新值。因为如果你说你能够捕捉到组合框的变化,那么通过它可以很容易地改变它。从我能说的那是唯一的方法 – Brendon

相关问题