2009-01-27 5 views
1

J'ai un formulaire avec 3 panneaux, les panneaux sont créés car à certains moments j'ai besoin de certains groupes de contrôles cachés/affichés. Jusqu'à présent, cela fonctionnait bien - jusqu'à ce que l'on me demande d'avoir un moyen spécifique de naviguer dans le formulaire avec la touche TAB. Tout d'abord, j'ai remarqué qu'il n'y a pas de propriété TabIndex dans l'objet Panel et, surtout, je ne veux pas suivre un algorithme de navigation imbriqué, je veux juste définir ma propre séquence. D'après ce que j'ai lu en ligne jusqu'à présent, ce n'est pas possible avec les panneaux. Ma seule alternative est de mettre tous les contrôles sur le formulaire dans le même panneau.Définition TabIndex dans CF. Framework

Des pensées? Je n'ai pas envie de réorganiser l'application, et commencer à se cacher et montrer des contrôles individuels.

Répondre

4

Appuyez sur la touche TAB pour déplacer le focus sur le contrôle suivant dans ControlCollection. Étant donné que le focus est toujours dans un contrôle au sein du Panel et non dans le panneau lui-même, comment pouvez-vous vous attendre à ce qu'un Panel prenne en charge l'index tabulation?

Je vous suggère de réfléchir à nouveau à ce que vous essayez de faire. Lorsqu'un panneau spécifique est visible, TAB devrait vous guider autour des contrôles qui s'y trouvent. Cela n'a pas de sens que TAB vous déplace dans le panneau suivant. Ceci est généralement fait avec un bouton ou un autre contrôle. Les utilisateurs s'attendent à ce que TAB déplace le focus et n'effectue pas d'action. De plus, si vous voulez que TAB vous déplace dans les panneaux, vous devez définir la propriété Tab Stop de tous les contrôles sur false.

0

Je pense que vous êtes bloqué ici - je ne connais aucun moyen direct d'éviter cette navigation imbriquée.

Je voudrais cependant dire que c'est vraiment pas que gros problème pour afficher/groupes masquer des contrôles:

private void SetPrimaryControlVisibility(bool visible) 
{ 
    ctrlA.Visible = visible; 
    ctrlB.Visible = visible; 
    ctrlF.Visible = visible; 
} 

private void SetSecondaryControlVisibility(bool visible) 
{ 
    ctrlC.Visible = visible; 
    ctrlE.Visible = visible; 
    ctrlG.Visible = visible; 
} 

Il est un peu plus l'écriture de code - mais qui m'a pris 20 secondes. Et s'ils sont tous sur la surface du formulaire, vous pouvez utiliser l'index des onglets.

Bien que maintenant que je pense à ce sujet, quel est le problème avec eux sur leur propre panneau? Si vous utilisez des panneaux pour afficher/masquer, vous ne tabulez pas les autres panneaux de toute façon.

Une autre option serait d'écrire des gestionnaires d'événements clés, mais je resterais loin de cela - serait un énorme gâchis impossible à maintenir.

2

J'ai eu le même problème. Ma solution était de mettre tous les contrôles dans les sous-panneaux sur le formulaire. La tabulation de l'algorithme .net consiste à tabuler dans le conteneur 'current' en utilisant TabIndex. Si l'un des TabIndex d'un conteneur est le même, le premier dans l'ordre z sera le premier, etc.

Une fois dans un conteneur (un formulaire est un conteneur), tous les contrôles autres que les conteneurs (panneaux) sont tabulé en premier. Lorsqu'ils quittent le dernier contrôle sans conteneur, les panneaux sont récursifs. Par conséquent, si tous les contrôles sont placés dans des conteneurs/panneaux au même niveau, votre tabulation sera effectuée comme prévu.

Exemple Problème:

 
Form 

    control1 Tabindex=1 

    panel1 

    control2 Tabindex=2 

    control3 Tabindex=2 

    panel2 

    control4 Tabindex=4 

    control5 Tabindex=5 

    control6 Tabindex=6 

Tabbing sera dans l'ordre suivant (pas ce que vous attendiez):

 
    Control1 

    Control6 <-- not what you wanted/expected 

    Control2 

    Control3 

    Control4 

    Control5 

Pour l'obtenir à l'onglet correctement, la mise en page selon le schéma suivant:

 
Form 

    panel0 

    control1 Tabindex=1 

    panel1 

    control2 Tabindex=2 

    control3 Tabindex=2 

    panel2 

    control4 Tabindex=4 

    control5 Tabindex=5 

    panel3 

    control6 Tabindex=6 
Questions connexes