2009-08-06 7 views
0

J'ai créé un ensemble de données et dans le concepteur j'ai créé les relations et les clés étrangères qui existent dans la base de données. Fondamentalement, j'ai un produit qui a une relation avec une table de prix. Le champ clé qu'ils partagent est IdProduct dans la table des prix. Dans le Fill/Get du produit, je renvoie le champ Prix.mettre à jour le jeu de données en utilisant join et bindingsource?

J'ai également un DataGrid qui utilise une BindingSource qui utilise cette table. Tout s'affiche correctement et lorsque je double-clique sur une ligne dans la grille de données, j'ouvre alors un formulaire à onglets qui contient une vue détaillée de l'enregistrement sélectionné.
À ce stade, l'utilisateur peut apporter des modifications à l'enregistrement et celles-ci sont renvoyées correctement à BindingSource. Le problème est que TableAdapter ne contient pas la mise à jour appropriée, donc je ne suis pas capable d'appeler la méthode TableAdapter.Update avec l'ensemble de données comme si j'avais créé un tableadapter n'utilisant pas de jointure.

Comment suis-je le mieux à gérer cette situation.

En même temps, je ne peux pas obtenir la ligne modifiée:

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

modifié est toujours null

Merci,

Répondre

0

Je n'ai pas trouvé une solution qui me plaît tout à fait.

Je ne sais pas comment faire la méthode de mise à jour en une, de sorte que mes deux tables qui sont "jointes" (jointure interne) dans l'ensemble de données, mettent à jour simultanément. J'ai eu le problème que même si les contrôles étaient databound à productosBindingSource, cette liaisonSource n'a pas mis à jour, donc ma solution finale était d'utiliser la ligne de l'ensemble de données directement, puis mettre à jour les tables des produits et des prix séparément. C'est embêtant, j'espérais avoir une mise à jour unique.

Mon code est finalement le suivant.

ce.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

Personnellement je fais toujours un foreach sur toutes les lignes ..
Ensuite, par ligne, je vérifie la propriété Row.RowState.

ATTENTION! TOUJOURS APPELER Row.EndEdit() avant de demander l'attribut rowstate car les autres valeurs difficiles ont changé, l'attribut rowstate n'est pas modifié ... (peut-être que c'était votre problème d'origine).

Si inchangé -> rien
Si supprimé -> delete
en cas de modification -> Déclaration de mise à jour
si ajoutée -> instruction d'insertion

Vous pouvez générer dynamiquement SQL sur la base des colonnes dans la table .
Vous pouvez même vérifier si les valeurs doivent être mises à jour en comparant les valeurs actuelles et originales.

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


Espérons que cela est suffisant pour vous y aller ..

Questions connexes