2009-08-06 10 views
0

Ich habe einen Datensatz erstellt und im Designer habe ich die Beziehungen und Fremdschlüssel, die in der Datenbank vorhanden sind, erstellt. Grundsätzlich habe ich ein Produkt, das eine Beziehung zu einer Tabelle von Preisen hat. Das Schlüsselfeld, das sie teilen, ist IdProduct in der Preisliste. In der Fill/Get des Produkts gebe ich das Preisfeld zurück.Datensatz mit Join und Bindingsource aktualisieren?

Ich habe auch ein DataGrid, das eine BindingSource verwendet, die diese Tabelle verwendet. Alles wird korrekt angezeigt, und wenn ich auf eine Zeile innerhalb des Datagrids doppelklicke, öffne ich ein Registerkartenformular, das eine detaillierte Ansicht des ausgewählten Datensatzes enthält.
Der Benutzer an diesem Punkt kann Änderungen am Datensatz vornehmen und sie werden ordnungsgemäß an die BindingSource weitergeleitet. Das Problem ist, dass der TableAdapter das entsprechende Update nicht enthält, daher kann ich die TableAdapter.Update-Methode nicht mit dem Dataset aufrufen, als hätte ich einen Tableadapter erstellt, der keinen Join verwendet.

Wie bin ich am besten mit dieser Situation umzugehen.

Zur gleichen Zeit kann ich keine modifizierte Reihe bekommen:

 dTiendasDs.ProductosDataTable modified = (dTiendasDs.ProductosDataTable) 
dTiendasDs.Productos.GetChanges(DataRowState.Modified); 

modifiziert ist immer null

Danke,

Antwort

0

Ich habe nicht zu bekommen, eine Lösung gefunden, die mich ganz gefällt.

Ich weiß nicht, wie man die Update-Methode in einem, so dass meine beiden Tabellen, die "Join" (innerer Join) im Dataset sind, gleichzeitig aktualisieren.

Ich hatte das Problem, dass, selbst wenn die Steuerelemente mit productosBindingSource verbunden waren, diese bindingSource nicht aktualisiert wurde. Meine endgültige Lösung bestand darin, die Zeile des Datasets direkt zu verwenden und dann die Produkttabellen und Preise separat zu aktualisieren. Es ist nervig, ich habe gehofft, ein einzigartiges Update zu haben.

Mein Code ist schließlich der folgende.

dies.productosBindingSource.EndEdit();

 dTiendasDs.Productos[0].idZona = 

Convert.ToInt32 (zonasCombobox.SelectedValue);

 dTiendasDs.Productos[0].Precio = 

Convert.ToDouble (this.precioTextBox.Text);

 dTiendasDs.Productos[0].EndEdit(); 


     if (dTiendasDs.HasChanges()) 
     { 
      this.productosTableAdapter.UpdateData(dTiendasDs.Productos[0]["nombre"].ToString(), 
       Convert.ToInt32(dTiendasDs.Productos[0]["idZona"]),Convert.ToInt32(dTiendasDs.Productos[0]["idProducto"])); 

      this.preciosTableAdapter.UpdateData(
       Convert.ToInt32(dTiendasDs.Productos[0]["idProducto"]), 
       Convert.ToDouble(dTiendasDs.Productos[0]["precio"]),IdTienda); 
     } 

     this.dTiendasDs.AcceptChanges(); 
0

Persönlich mache ich immer eine foreach auf allen Zeilen ..
Dann pro Zeile überprüfe ich die Row.RowState Eigenschaft.

ACHTUNG! Rufen Sie immer Row.EndEdit() bevor Sie den rowstate, weil sonst harte Werte geändert haben, der rowstate ist nicht geändert .. (vielleicht war das Ihr ursprüngliches Problem).

Wenn unverändert -> nichts
Wenn gelöscht -> löschen Anweisung
wenn geändert -> Update-Anweisung
wenn hinzugefügt -> Insert-Anweisung

Sie können dynamisch Ihre SQL basierend auf den Spalten in der Tabelle erzeugen .
Sie können sogar überprüfen, ob Werte aktualisiert werden müssen, indem Sie die aktuellen und ursprünglichen Werte vergleichen.

object o1 = pRow[fCol, DataRowVersion.Current]; 
object o2 = pRow[fCol, DataRowVersion.Original]; 


Hoffe, das ist genug, um Sie ..

Verwandte Themen