2010-10-12 7 views
0

J'ai vue DataGrid qui affiche les données de table à partir d'une base de donnéesC# DataGrid écrire automatiquement des valeurs à DB

Environnement: - C# 4.0 - SQL Server 2005 - Visual Studio 2010

Ce que je veux est : Sur une rangée à la rangée automatiquement enregistrer les modifications. Donc, quand je modifie la première rangée, puis quittez la rangée. Il devrait enregistrer les modifications dans la base de données.

Je l'ai utilisé ce code:

Dans la de1 Charge:

dataSet1.TblObject.RowChanged += rowUpdate; 

Le eventhandler:

private void rowUpdate(object sender, DataRowChangeEventArgs e) 
{ 
    DataRow dr = e.Row; 
    if (dr.RowState == DataRowState.Modified) 
    { 
     tblObjectTableAdapter.Update(dr); 
    } 
} 

Quand j'ai édité une ligne de la grille, est tblObjectTableAdapter.Update(dr); appelé les données sont stockées dans la table. Ce qui est bon. Mais l'événement continue de se déclencher comme s'il était appelé de manière récursive. Ainsi, le tblObjectTableAdapter.Update(dr); provoque un événement dataSet1.TblObject.RowChanged. Mais je ne peux pas faire la différence entre les deux. Je devine que j'utilise le mauvais événement pour stocker mes valeurs mais je ne peux trouver aucun événement qui me semble logique. Qu'est-ce que je fais mal?

J'ai fait un xsd ensemble de données:

TblObject

J'ai choisi l'ensemble de données comme source de données dans ce gridview:

alt text

+0

Laissez-moi votre question directement, l'événement se déclenche sans vous changer une ligne? Pouvez-vous élaborer sur le problème lui-même? – Emerion

+0

L'événement continue de se déclencher. Mais seulement je édite une ligne dans le formulaire. Ce qui est ce que je veux, mais je ne veux pas que cela se produise quand j'appelle 'tblObjectTableAdapter.Update (dr);' –

Répondre

0

Ok, j'ai lu votre message un couple de temps maintenant, alors que je ne peux pas vous aider directement avec votre problème. Je vais essayer quand même, ce que vous voulez, c'est que lorsque je fais un changement, il ne se met pas à jour immédiatement, mais enregistre les informations dans une liste et quand vous appuyez sur un bouton enregistrer les mises à jour?

Ensuite, vous devriez faire une liste de Datarows, et chaque fois qu'une ligne est modifiée ajouter cet élément à la liste, de cette façon les mises à jour ne sont pas faites directement, mais seulement lorsque vous appuyez sur le bouton. (Ceci est aussi bien meilleur pour l'amour de la performance.)

Ainsi, au lieu du code

DataRow dr = e.Row; 
if (dr.RowState == DataRowState.Modified) 
{ 
    tblObjectTableAdapter.Update(dr); 
} 

U devrait faire

DataRow dr = e.Row; 
    if (dr.RowState == DataRowState.Modified) 
    { 
DatarowLst.Add(dr); 
    } 

ButtonSave_Click(object sender, eventargs e) 
{ 
foreach (DataRow d in DatarowLst) 
{ 
tblObjectTableAdapter.Update(d); 
} 
} 

EDIT:

Ok désolé pour malentendu u . Je comprends maintenant votre problème et ai examiné le problème. J'ai trouvé des informations intéressantes sur les cartes et les adaptateurs de données. Il semble que l'adaptateur effectue une vérification de rangée à rangée afin d'obtenir des informations sur les modifications effectuées (par exemple, a-t-il besoin d'une commande de mise à jour ou de suppression?) My GUESS indique que cela déclenche une mise à jour. et exécutant la méthode de manière récurrente.

Infos trouvé à la pièce sur REMARK: This site from msdn

Ils donnent un lien vers this site pour plus d'informations. Peut-être que vous trouverez votre réponse là-bas. Pour une solution à votre problème, il semble que vous pouvez laisser votre événement et appelez simplement la commande de mise à jour. Je ne suis pas sûr de cette cause, je n'ai pas le temps de vérifier cela et j'ai peu d'expérience sur ce sujet.

Eh bien, espérons que cela aide u un peu plus loin ..

+0

Non désolé ce n'est pas ce que je suis en train de faire. J'ai édité ma question peut-être que c'est plus clair maintenant. –

Questions connexes