DataGridView -Valeur n'est enregistrée si la sélection n'est pas perdu à partir d'une cellule
Je suis en utilisant le Contrôle DataGridView pour la lecture et l'écriture d'un fichier XML par le biais de la Sérialisation XML.
J'ai un problème comme expliqué ci-dessous:
- Je lire un fichier XML et de le remplir DataGridView avec des commandes de l'objet désérialisé.
- - Je mettre à jour toutes les valeurs sur le DataGridView sur la cellule.
- - Je choisir le Fichier option Enregistrer sous sans perdre le focus sur la dernière cellule.
Après cela, la valeur de la cellule n'est pas mis à jour. Si j'ai volontairement détourner l'attention (dire que j'cliquez sur une autre cellule sur la même grille), la valeur est mise à jour.
Quelqu'un peut-il suggérer une solution pour cela?
OriginalL'auteur | 2009-06-08
Vous devez vous connecter pour publier un commentaire.
C'est parce que la cellule modifiée de la valeur ne s'est pas engagée à la source de données jusqu'à ce qu'il soit validé, ce qui se produit lorsque la cellule perdre le focus. Si vous souhaitez valider les modifications immédiatement, vous pouvez gérer le CurrentCellDirtyStateChanged de l'événement, et d'appeler la CommitEdit méthode dans le gestionnaire :
Cela fonctionne parfaitement dans ma méthode de sauvegarde. Merci!!
C'est aussi travaillé très bien pour moi. Merci
comment est-ce mieux que datagridview1.EndEdit()
Ce n'est pas convenable s'il y a de validation, car certaines entrées valides ne peuvent pas être tapé sans passer par un état non valide. Par exemple, vous ne pouvez pas entrer de 1.6 e-19 dans une cellule qui exige une double raison d'une erreur de validation serait pop up dès que vous arrivez à 1.6 e.
OriginalL'auteur Thomas Levesque
La meilleure façon (bien que rapide et sale) est à affecter la currentCell de la valeur à
Nothing
.Par exemple, dans la méthode save, n':
et puis aller plus loin.
OriginalL'auteur Amit Karmakar
Si je vous comprends bien, une cellule est en mode d'édition et que vous essayez de l'arrêter par programmation de l'édition et de transmettre la valeur de la source de données sous-jacente?
Je suis en utilisant un peu "sale" de l'approche pour le faire que dans une de mes applications:
Ce bout de code vérifie d'abord si la cellule active est en mode édition. Elle change alors de la cellule par programmation (à la ligne précédente ou la ligne suivante dans le cas où nous sommes dans la première ligne). Après cela, il restaure la cellule en cours de sélection.
Vous appeler ce code dans votre Fichier "Enregistrer sous" gestionnaire.
Content d'avoir pu aider. Pourriez-vous marquer ce que votre solution?
OriginalL'auteur Thorsten Dittmar
J'ai eu la même situation et j'ai même été en utilisant les touches de raccourci pour le bouton enregistrer pour enregistrer les valeurs de grille. Quand je clique sur le bouton Enregistrer l'accent perdues à partir de la dg v, et donc la valeur de la cellule est engagé, mais lorsque j'utilise les touches d'accès rapide focus n'a pas perdu de DGV donc pas de validation de la valeur de la cellule.
Après avoir regardé la Amit Karmakar répondre à la curiosité, j'ai essayé de répondre et cela a fonctionné. Pour plus de détails, je suis allé dans le débogage de la DGV et trouve que c'est vraiment la même chose que commitedit qui en quelque sorte ne fonctionne pas si vous l'utilisez cliquez sur le bouton enregistrer.
Lorsque nous avons mis en CurrentCell de la dg v, null, avant de le mettre à null DGV obtient d'abord la valeur modifiée et le pousse dans à la valeur de la cellule et ensuite CurrentCell RÉFÉRENCE à null. Ici, il ne veut pas dire qu'il se couche sous-jacente de la dg v de la cellule à la valeur null. Donc, cela fonctionne parfaitement pour le problème ci-dessus.
Remarque: Cette solution peut ne pas fonctionne parfaitement lorsque vous avez la validation des événements pour la cellule et si l'utilisateur entre des données non valides qui échoue à la validation. Dans ce cas, le réglage actuel de la cellule à la valeur null échoue également qu'il ne peut pas pousser la valeur de la cellule.
J'ai donné cette explication que j'ai soulevé la question sur Amit Karmakar réponse demandant comment peut-il être possible. Je pense qu'il peut aider d'autres, donc abandonné cette explication comme réponse.
OriginalL'auteur JPReddy
OK, c'est MOCHE mais ça fonctionne pour obtenir les dernières MODIFICATIONS de la grille SANS avoir à les déplacer vers une autre ligne:
Cependant, j'aime toujours la réponse de Amit Karmakar le meilleur.
J'ai ajouté le " DataGridView1.CurrentCell = Nothing' à la DataGridView1 événement LostFocus.
OriginalL'auteur davidWazy
Vous pouvez obtenir la valeur de la cellule qui n'est pas encore commis à l'aide de la EditedFormattedValue propriété dans la cellule en cours, comme ci-dessous
OriginalL'auteur