2008-12-01 4 views
7

J'ai un contrôle TextBox sur mon formulaire. J'utilise l'événement Leave sur le contrôle pour traiter les entrées utilisateur. Cela fonctionne bien si l'utilisateur clique sur un autre contrôle sur le formulaire, mais le même ne se déclenche pas lorsque l'utilisateur va directement au menu principal. Des idées quel événement dois-je utiliser pour le faire virer à chaque fois?WinForms: l'événement de quitter la zone de texte ne se déclenche pas après avoir accédé au menu principal

Répondre

6

J'ai trouvé une solution raisonnable, je mets l'accent sur le menu principal manuellement:

EDIT: Comme suggéré par @TcKs, j'ai changé l'événement de ItemClicked à MenuActivate. Merci beaucoup pour votre aide!

private void menuStrip1_MenuActivate(object sender, EventArgs e) 
    { 
     menuStrip1.Focus(); 
    } 
+0

Cela fonctionne seulement pour la souris, mais pas pour le clavier. S'il vous plaît voir mon edit. – TcKs

2

Vous devez utiliser les événements "Validation" et "Validé" pour vérifier l'entrée de l'utilisateur. Ensuite, si l'utilisateur passe à un autre contrôle "A" et que le contrôle "A" a la propriété "CausesValidating" définie sur "true" (sa valeur par défaut), l'événement "Validating" et "Validated" seront déclenchés.

Le menu possède également la propriété "CuasesValidation".

Editer: Désolé, j'ai oublié le "CuasesValidation" dans la barre de menu est notre fonctionnalité et non intégré. Mais le chèque de validation est assez simple:

private void menuStrip1_MenuActivate(object sender, EventArgs e) { 
    bool ret = this.Validate(false); 
    if (false == ret) { 
     // user's input is wrong 
    } 
} 

utilisateur tout ContainerControl au lieu de « ce », si vous voulez vérifier la validation dans un autre contrôle que la forme « ce ». Par exemple dans la fenêtre enfant MDI.

+0

Je ne peux pas trouver la propriété CausesValidating sur ToolStripMenuItem ou MenuStrip ... – Stefan

+0

Je ne peux pas trouver la propriété CausesValidating sur ToolStripMenuItem ainsi – Grzenio

0

lors de la lecture avec un menu, vous devez simuler, en quelque sorte, un LostFocus et se souvenant peut-être où il était dans le cas où vous fermez le menu sans faire quoi que ce soit si l'accent retournerait dans la zone de texte

1

Il y a quelques cas lorsque Lostfocus n'est pas activé, par exemple en cliquant sur les boutons de la barre d'outils et les éléments de menu. J'utilise pour contourner cela avec une variable locale "LastControl" et le manipuler moi-même quand le menu a le focus.

Il existe des raisons pour lesquelles le clic sur un menu ne perd pas le focus de la zone de texte. Si vous voulez avoir par exemple un menu "Edition" avec "Coller", le "Coller" devrait agir contre le contrôle qui a le focus et à cause de cela il ne doit pas voler le focus des contrôles sur le formulaire. Par conséquent, le menu peut être vu comme un menu contextuel qui ne vole pas le focus du contrôle.

+0

Il est juste que le menu ne vole pas le contrôle - mais d'un autre côté, il n'y a pas de mécanisme pour gérer mon scénario d'une manière raisonnablement simple. Votre méthode est OK dans des cas simples, mais j'ai une hiérarchie de contrôles utilisateur utilisés sur différents formulaires, donc je ne peux pas vraiment avoir LastControl – Grzenio

+0

Ouais, j'étais prêt à poster un exemple qui a transmis dynamiquement un InvokeLostFocus (LastControl) lorsque le menu a été activé. Mais alors j'ai vu votre solution de contournement avec menustrip1.focus() donc je n'ai pas. ;) – Stefan

-1

vous avez besoin d'une étiquette 1 pixel par 1 pixel

Private Sub TextBox1_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Leave 
    MsgBox("yes") 
End Sub 

Private Sub MenuStrip1_MenuActivate(ByVal sender As Object, ByVal e As System.EventArgs) Handles MenuStrip1.MenuActivate 
    CType(sender, MenuStrip).Tag = ActiveControl 
    Label1.Focus() 
End Sub 

Private Sub MenuStrip1_MenuDeactivate(ByVal sender As Object, ByVal e As System.EventArgs) Handles MenuStrip1.MenuDeactivate 
    If CType(sender, MenuStrip).Tag Is Control AndAlso CType(CType(sender, MenuStrip).Tag, Control).CanFocus Then 
     CType(CType(sender, MenuStrip).Tag, Control).Focus() 
    End If 
    CType(sender, MenuStrip).Tag = Nothing 
End Sub 
+0

Je sais que c'est le code VB.Net mais il devrait être la même logique sous C# – Fredou

+0

Ne semble pas fonctionner cependant - ActiveControl est l'élément de menu que j'ai cliqué sur :( – Grzenio

Questions connexes