2010-06-04 3 views
0

Je veux montrer un formulaire, mais je ne veux aucun des contrôles ciblés. Par exemple, maintenant, lorsque le formulaire est affiché, le bouton avec l'index tab 0 est mis au point. Je veux que le formulaire lui-même, pas un bouton, soit mis au point, de sorte que si l'utilisateur frappe accidentellement une touche, il ne fera rien. Est-ce possible? Merci!Comment afficher un formulaire sans aucun contrôle?

Répondre

3

Vous devriez probablement placer le focus quelque part relativement inoffensif au départ, tel que le bouton "Annuler" si votre formulaire contient une telle chose.

Une solution de contournement que j'ai testet;

private void Form1_Shown(object sender, EventArgs e) 
    { 
     textBox1.TabStop = false; 
     textBox1.Focus(); 
     textBox1.Left = -300; 
    } 

Ce « cache » la zone de texte en mettant l'accent en le déplaçant hors de la zone visible. En le faisant de cette manière hackish, la zone de texte conserve la possibilité d'avoir le focus.

[edit] Cela (évidemment) vous oblige à avoir une zone de texte nommée textBox1 sur votre formulaire qui n'est pas utilisé pour autre chose.

0

vous ne pouvez pas. Il existe une solution de contournement BTW. Ajouter un contrôle caché à la forme (une zone de texte par exemple) et faire

TextBox1.Focus(); 

en cas Form_Shown ou Form_Load.

+0

Oui, mais sachez que cela peut être un peu déroutant pour les utilisateurs qui se déplacent beaucoup avec la touche de tabulation car la mise au point saute parfois à un endroit qu'il ne peut pas voir. Et assurez-vous que vous définissez le tabindex du contrôle caché correctement. –

+0

évidemment, il est préférable de définir TextBox1.TabStop = false. – vaitrafra

+0

J'ai essayé cette solution de contournement et cela ne semble pas fonctionner. Le focus semble revenir au premier contrôle visible dans le taborder – LaustN

0

Vous pouvez définir la propriété TabStop sur false pour chaque contrôle, mais vous ne pourrez pas passer d'un onglet à l'autre dans les contrôles. Cela peut être ou ne pas être une bonne solution pour vous, mais cela devrait empêcher l'un des contrôles de recevoir des données jusqu'à ce que l'utilisateur clique dessus.

1

Vous pouvez MyInvisibleLabel.Select(); dans _Load ou, si vous en avez un, faites simplement la mise au point sur le bouton Quitter/Annuler/Fermer.

3

Essayez ceci: Ajoutez un contrôle Panel à votre formulaire et conservez les paramètres par défaut. Le panneau peut avoir n'importe quelle taille et être positionné n'importe où. Je vais appeler ce membre m_panel. Dans votre constructeur, définissez la propriété ActiveControl de votre formulaire sur m_panel. Enfin, assurez-vous que la propriété TabStop du panneau est définie sur false (ce qui est le cas par défaut).

Lorsque le formulaire est chargé, m_panel obtient le focus. Cependant, puisque le panneau n'a pas de bordure et a la même couleur que l'arrière-plan du formulaire, il n'y a aucune indication qu'il existe, de sorte que vous pouvez effectivement dire que le formulaire lui-même a le focus, comme vous le vouliez. Lorsque l'utilisateur frappe d'abord Tab ou clique dans un contrôle, le panneau sera hors de l'équation (puisque TabStop est false) et les choses vont fonctionner normalement.

Remarque: vous pouvez également utiliser un Label vide plutôt qu'un Panel, tout ce qui vous convient. Vous pouvez même utiliser l'une de vos étiquettes existantes. N'oubliez pas d'utiliser ActiveControl pour spécifier le contrôle d'intérêt, ou le concentrer explicitement en appelant Focus, car il n'obtiendra pas le focus automatiquement.

0

La réponse de vaitrafra est suffisante, mais s'il vous arrive d'avoir une étiquette sur votre formulaire, vous pouvez simplement mettre l'accent sur ce point. La réponse acceptée here fournit un peu plus d'informations sur la raison pour laquelle vous ne pouvez pas vous assurer que tous les contrôles du formulaire n'ont pas le focus.

+0

Bon point sur le fonctionnement de l'étiquette. – Charlie

0

Si vous définissez l'étiquette à mettre au point pendant le chargement de la page, cela ne fonctionnera pas.Ce que vous devez faire est de définir le contrôle actif de la page sur l'étiquette que vous voulez mettre au point à la place de la zone de texte.

ex: this.ActiveControl = lbltest;

0

La solution est simple:

protected override void OnShown(EventArgs e) 
{ 
    base.OnShown(e); 

    ActiveControl = null; 
} 

Par ailleurs, si toutes les commandes sont à l'intérieur d'un panneau à quai pour remplir, vous pouvez vous concentrer le panneau:

protected override void OnShown(EventArgs e) 
{ 
    base.OnShown(e); 

    pnlMain.Focus(); 
} 

Avec l'une ou l'autre approche, appuyez sur la touche de tabulation pour ensuite mettre au point le premier contrôle dans l'ordre des onglets.

Questions connexes