Question

Dans WinForms, pour définir le focus sur un contrôle spécifique, il semble que je finisse toujours par appeler Control.Select () et Control.Focus () pour que cela fonctionne.

Quelle est la différence et est-ce la bonne approche?

Était-ce utile?

La solution

  

Focus est une méthode de bas niveau principalement destinée aux auteurs de contrôles personnalisés. Au lieu de cela, les programmeurs d'applications 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

Autres conseils

La mise au point () est la fonction de bas niveau qui définit la mise au point.

Select () est une méthode de niveau supérieur. Il commence par rechercher de manière itérative vers le haut dans la hiérarchie parentale 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 de ces méthodes n’est toutefois pas simple et il existe une manipulation spéciale pour les conteneurs UserControl.

Pour un exemple de différence, si vous essayez de définir un contrôle pour une application Forms sur le focus par défaut lorsque vous l'ouvrez, seul Select () fonctionnera lorsqu'il sera appelé dans le constructeur après InitializeComponent (). Focus () ne sera pas.

Juste pour ajouter à ce fil, j’ai trouvé cela 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 d'origine ne pouvait plus sélectionner le contrôle, mais l'utilisation du focus le lui permettait. Je pense que cela souligne les réponses concernant les niveaux auxquels ces méthodes fonctionnent. Mais cela signifie aussi qu’il n’est pas assez simple de dire utiliser Select au niveau supérieur, car select ne fonctionnait plus comme prévu sur la forme originale.

La mise au point (), dans certaines situations, peut faire en sorte que la fenêtre possédant le contrôle obtienne la mise au point si elle n’était pas active. Select () ne provoque pas de capture de focus par la fenêtre.

De mon expérience personnelle, j’ai écrit un contrôle utilisateur héritant de Windows ComboBox. Je devais écrire du code pour remplacer l'événement OnEnter et j'avais une déclaration à cet endroit disant

If Me.Focused Then ... Else ...

Cependant, malheureusement, le résultat inattendu a été renvoyé. Si j'ai appelé MyCustomerComboControl.Select (dans les événements Load, Shown ou Activated), elle a appelé la méthode OnEnter mais n'a pas réussi à l'enregistrer. Cette option avait le focus (c'est-à-dire que Focused était False) mais si j'ai appelé Focus cela a fonctionné. De plus, Select fonctionnait si le formulaire était ouvert, c’est-à-dire que si je sélectionnais un autre contrôle puis re-sélectionnais le contrôle original, tout allait bien. Par conséquent, dans toutes les circonstances autres que mon scénario, utilisez Sélectionnez car il est indiqué plus haut.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top