2009-04-21 4 views
5

J'ai un DataGridView qui est défini sur EditOnF2. Je fais un traitement spécial des données dans le gestionnaire d'événements CellEndEdit qui définit la valeur de la cellule. Je veux toujours la fonctionnalité de l'EditOnKeystrokeOrF2 de revenir à la valeur d'origine lorsque la touche Esc est enfoncée. Malheureusement, dans le gestionnaire d'événements CellEndEdit, je ne vois pas de moyen de dire ce qui a provoqué le déclenchement de l'événement CellEndEdit. Je veux seulement changer la valeur de la cellule si la touche Esc n'est pas pressée. Comment puis-je savoir si c'était le cas ou non?Comment puis-je capturer la frappe qui déclenche "CellEndEdit" sur un DataGridView en C#?

Éditer: Il est à noter que l'événement KeyDown n'est pas déclenché lorsque la cellule est en cours d'édition, ni pour la fin de la séquence de touches. Edit2: J'ai essayé la suggestion KeyPreview, mais le formulaire ne capture toujours pas la touche Echap appuyée. Edit3: J'ai expérimenté avec essayant de faire fonctionner ceci. À l'origine, j'ai publié certains des articles suivants dans un article distinct, mais je pense qu'il serait peut-être plus pertinent de les inclure ici.

J'ai une cellule dans un DataGridView qui est maintenant défini sur EditProgrammatically. Pour capturer la frappe qui commence une édition, je mets le cell.Value égal à la frappe. Cependant, cela ruine la fonctionnalité "Echap" de la cellule - lorsque vous appuyez sur Echap, au lieu de revenir à la valeur d'origine, elle revient à la frappe que j'ai insérée par programme dans la cellule.

Je crois que si je pouvais définir le "EditedFormattedValue" sur une cellule, ce serait là où je veux mettre ma valeur de frappe, mais cela semble être en lecture seule. Comment puis-je accomplir ce que je tente?

Un exemple à clarifier: Si la cellule a une valeur de "54.3" dans celle-ci, et que j'appuie sur la touche "9", elle commence à éditer la cellule et y place un "9". Si j'appuie sur Escape, au lieu de revenir à "54.3", il revient à "9". Ce que je veux, c'est qu'il revienne à sa valeur d'origine de "54,3". Donc, j'essaie d'aborder ce problème à la fois du début et de la fin. Je pense que le vrai problème est que je suis en train d'écraser la valeur d'origine et que je n'ai aucun moyen de déterminer si je devrais la rétablir ou non. Edit4: Il semble que CellValidating puisse être utile, mais je vois un comportement étrange quand je l'expérimente. Dans un nouveau projet, je crée le DataGridView et m'enregistre pour les divers événements et vois que CellValidating est déclenché avant le CellEndEdit. Cependant, dans mon projet où j'essaye de faire fonctionner ceci, CellEndEdit tire AVANT CellValidating. Des idées sur ce que la différence pourrait être?

Répondre

2

Définissez le KeyPrevew property sur votre formulaire sur true; cela empêchera le contrôle de l'engloutir en premier. :)

+0

Merci, mais après avoir essayé cela, il semble que la clé d'échappement est toujours être reconnu par la cellule comme la fin de l'édition et non comme un événement KeyDown ou KeyPress réel sur le formulaire. –

0

Tout d'abord, vous avez absolument raison, KeyPreview ne fonctionnera pas. Au début, j'ai pensé que je pourrais contourner cela en remplaçant la méthode IsInputKey du formulaire. Cette technique a fonctionné pour moi dans d'autres cas où je ne pouvais pas attraper une clé que j'avais besoin d'attraper. Cela n'a pas fonctionné non plus, donc j'ai essayé de sous-classer le DataGridView et de surcharger IsInputKey là. Cela n'a pas fonctionné non plus. Après avoir creusé à travers les autres méthodes que je pouvais contourner, j'ai appris qu'il y avait une autre classe de clés appelées clés de commande que j'avais besoin d'intercepter. Pour ce faire, remplacez ProcessCmdKey sur votre DataGridView (vous devrez le sous-classer).

Voici mon code:

public class CommandKeyInterceptingDataGridView : DataGridView 
{ 
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData) 
    { 
     Debug.WriteLine(keyData); 
     return base.ProcessCmdKey(ref msg, keyData); 
    } 
} 

Et la sortie d'entrer dans le mode d'édition avec F2, la modification d'une cellule à dire « Bonjour » et l'annulation de l'édition avec évasion.

F2 
ShiftKey, Shift 
H, Shift 
E 
L 
L 
O 
Escape 

Espérons que cela vous donne ce dont vous avez besoin.

0

Mon problème était similaire, voici ma solution:

Problem: Lorsque l'utilisateur a commencé à éditer une valeur de cellule dans DGV et pressé la touche ESC avant d'engager EndEdit de valeur était appelée, qui récrit tous les champs DGV à la base de données mettant ainsi à jour la date de mise à jour & champs de temps, je voulais que DGV.EndEdit à exécuter lorsque l'utilisateur a effectivement changé la valeur et n'a pas appuyé sur ESC en faisant cela.

Solution: dans la validation de la cellule i utilisé un drapeau comme this pour vérifier si la valeur est modifiée et si la valeur de drapeau est fausse le faire juste un if(!flag)return; sur EndEdit

Questions connexes