Quelle est la différence entre le contrôle.Sélectionnez () et contrôle.Focus()?
Dans WinForms, pour mettre le focus sur un contrôle spécifique, je semble toujours finir par appeler Control.Select()
et Control.Focus()
pour que ça marche.
Quelle est la différence, et est-ce la bonne démarche?
6 réponses
Focus est une méthode de bas niveau destinée principalement aux auteurs de contrôles personnalisés. Au lieu de cela, les programmeurs d'application doivent utiliser la méthode Select ou la propriété ActiveControl pour les contrôles enfants, ou la méthode Activate pour les formulaires.
Http://msdn.microsoft.com/en-us/library/system.windows.forms.control.focus.aspx
Focus() est la fonction de bas niveau qui définit réellement le focus.
Select () est une méthode de plus haut niveau. Il regarde d'abord itérativement vers le haut dans la hiérarchie parent du contrôle jusqu'à ce qu'il trouve un contrôle de conteneur. Ensuite, il définit la propriété ActiveControl de ce conteneur (sur le contrôle appelé). La logique dans ces méthodes n'est pas simple cependant, et il y a une gestion spéciale pour les conteneurs UserControl.
Pour un exemple de la façon dont ils sont différents, si vous essayez de définir un contrôle pour une application de formulaires pour la mise au point par défaut lorsque vous l'ouvrez, seul Select () fonctionnera lorsqu'il est appelé dans le constructeur après InitializeComponent (). Focus() ne sera pas.
Juste pour ajouter à ce fil, j'ai trouvé que lors de l'écriture d'un contrôle utilisateur qui déplaçait d'autres contrôles d'un formulaire à un autre (formulaire nouvellement créé). Le formulaire original ne pouvait plus sélectionner le contrôle, mais l'utilisation du focus lui permettait de le faire. Je pense que cela met l'accent sur les réponses sur les niveaux de travail de ces méthodes. Mais cela signifie aussi qu'il n'est pas assez simple de dire utiliser Select au niveau supérieur puisque select ne fonctionnait plus comme prévu sur le formulaire original (pas qu'il devrait être placé dans une forme différente - je l'accepte)
Par expérience personnelle, j'ai écrit un contrôle utilisateur héritant de la liste déroulante Windows. J'ai dû écrire du code pour remplacer l'événement OnEnter
et j'avais une déclaration disant
If Me.Focused Then ... Else ...
Cependant, malheureusement, il a retourné le résultat inattendu. Si j'ai appelé MyCustomerComboControl.Select
(dans les événements Load, Shown ou Activated), il a appelé la méthode OnEnter
mais n'a pas réussi à enregistrer le focus (C'est-à-dire que Focused était faux) mais si j'ai appelé Focus, cela a fonctionné. En outre, Select
a travaillé si le formulaire était ouvert, c'est-à-dire si je sélectionné un autre contrôle puis re-sélectionné le contrôle d'origine tout allait bien. Donc, dans d'autres circonstances que mon scénario, utilisez Select
parce qu'il le dit ci-dessus.
Focus (), dans certaines situations, peut amener une fenêtre possédant le contrôle à se concentrer si elle n'avait pas de focus. Select () ne provoque pas de capture de focus par la fenêtre.