2009-09-08 7 views
1

J'essaie d'utiliser la touche Entrée pour passer à la colonne suivante (non-lecture seule) dans un DataGridView. Dans des circonstances normales, je gère l'événement KeyDown et tout fonctionne très bien.DataGridView navigation sur Entrée/Retour

Cependant, quand je suis édition un champ, la touche Entrée complète toujours le modifier, puis se déplace vers la prochaine ligne .

Assez étrangement, je reçois la séquence suivante d'événements dans mon lit d'essai. (Les nombres entre parenthèses sont (rowIndex, columnIndex) de l'événement arg).

Sans navigation alternative:

Appuyez sur Entrée (sans modifier le champ):

PreviewKeyDown key = Return 
KeyDown key = Return 
CellLeave (0, 0) 
RowLeave (0, 0) 
CellValidating (0, 0) 
CellValidated (0, 0) 
RowEnter (1, 0) 
CurrentCellChanged 
CellEnter (1, 0) 
SelectionChanged 
KeyUp key = Return 

Appuyez sur Entrée (tout en modifiant le champ):

CellClick (0, 0) 
CellBeginEdit (0, 0) 
EditingControlShowing 
    (I press Enter now) 
CellLeave (0, 0) 
RowLeave (0, 0) 
CellValidating (0, 0) 
CellValidated (0, 0) 
CellEndEdit (0, 0) 
RowEnter (1, 0) 
CurrentCellChanged 
CellEnter (1, 0) 
SelectionChanged 
KeyUp key = Return 

-à-dire que je n'obtenir un L'événement PreviewKeyDown ou KeyDown lorsque j'appuie sur Entrée lors de la modification d'un champ.

J'ai essayé de pirater une autre navigation dans les gestionnaires d'événements. À des fins de test, je modifie toujours (r0, c0) et "navigue" en définissant l'explicité de la propriété CurrentCell à (r0, c1).

Lorsque je définis CurrentCell dans CellEndEdit, je me retrouve à (r1, c1). Quand je mets le CurrentCell dans KeyUp, je finis par (r0, c1), ce qui est bien, mais seulement après qu'il sélectionne visiblement (r1, c0). Je suppose que je pourrais désactiver les mises à jour sur le contrôle lors de la navigation, mais cette solution semble inélégante.

Un conseil? Est-ce que je manque quelque chose?

Répondre

1

Après flailing au hasard sur les d'une analyse minutieuse, il semble que la clé est de tirer de DataGridView et passer outre DataGridView.ProcessDialogKey() et ProcessDataGridViewKey()