2016-04-29 15 views
0

Ich versuche den Wert einer Zelle in einer Datagridview-Spalte zu ändern, abhängig von der Auswahl in einer hinzugefügten Combobox-Spalte in derselben Datagridview.C# ändern Gridview Spalte Daten nach Gridview Combobox?

Ich habe mit allen möglichen BindingSources herumgespielt, aber nichts scheint es richtig zu machen.

Der Code Ich verwende ist:

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; 

Nur damit Sie ein visuelles haben, um es einfach: ich die Zellen in dem „Preis“ -Spalte will in Abhängigkeit von der Auswahl zu ändern, in dem " Produkt "Kombibox. Die Combobox nimmt ihre Daten aus einer Tabelle in der Datenmenge namens "Products", während der Rest des Datagrids seine Daten aus einer Tabelle namens "Lines" bezieht.

Die Frage ist, ist meine einzige Option, die Spalte "Preis" zu entfernen und manuell eine weitere Spalte hinzuzufügen, die sich mit der Combobox ändert? Wenn nicht, welche anderen Optionen habe ich?

Windows Form Window

+0

__Nicht__ ein 'DataGridView'a' GridView' oder ein 'DataGrid' aufrufen !! Dies ist falsch und verwirrend, da es sich um verschiedene Steuerelemente handelt. Ruf die Dinge immer nach ihrem __right__ Namen! Ja, es dauert __four__ Buchstaben mehr zu tippen. - Wie für Ihre Frage: Wenn die DGVs datengebunden sind, müssen Sie nicht die Zelle, sondern die DataSource ändern. – TaW

+0

Ich habe das versucht, aber das Ändern der DataSource ändert es für ALLE Spalten, und ich möchte nur die eine Spalte ändern. Ich nehme an, es gibt keine Möglichkeit, dies zu tun, außer eine andere Spalte manuell hinzuzufügen? –

Antwort

1

Ich habe nicht Kombinationsfelder in Datennetzen vor, aber es könnte eine gute Idee sein, um zu sehen, wenn Sie können einen Event-Handler auf der Änderung des Kombinationsfelds Index verwendet, wenn Sie tun können, dass Verwenden Sie das dann, um das Datenraster bei jeder Änderung zu aktualisieren. Wenn dies nicht möglich ist, können Sie es als separates Kombinationsfeld verwenden und beim Laden des Formulars mit den Produkten auffüllen. Bei jeder Auswahl eines Produkts wird dann die Rasteransicht aktualisiert, um den Preis und die Menge anzuzeigen. Auch von einem visuellen Standard persönlich würde ich den Produktnamen am Anfang haben, aber das ist meine persönliche Präferenz. Hoffe das hat geholfen.

+0

Ich kann die Combobox ändern, aber das wird noch nichts tun, weil die Preisspalte bisher noch nicht mit der Combobox verbunden ist. Das Ändern der Combobox ändert nichts, wenn ich keine Möglichkeit finde, die Price-Spalte an die Combobox-Spalte zu binden. –

+0

Wenn Sie die Änderung abfangen, sollten Sie in der Lage sein, eine Abfrage auszuführen, die den Preis basierend auf dem Produkt festlegt. Sie können das Datagridview bei Änderung erneut rendern, um die neuen Werte zu enthalten. Denn wenn Sie sagen, dass Sie in der Lage sind, die Änderung der Combobox zu erfassen, dann sollte es leicht sein, dies zu ändern. Von dem, was ich sagen kann, ist das der einzige Weg – Brendon