2010-01-25 12 views
3

J'ai un panneau enfant dans un formulaire qui contient des zones de texte et des boutons. J'ai essayé de définir les propriétés tabstop et tabindex pour ces contrôles afin que l'utilisateur puisse tabuler d'un contrôle à l'autre. Mais pour une raison quelconque, la tabulation ne fonctionne pas, le conservateur reste sur le même champ qui a le focus lorsque j'appuie sur la touche de tabulation. J'utilise C# avec le framework .Net 3.5. Voici comment mon code ressemble -Windows Form - La touche de tabulation ne fonctionne pas dans un panneau enfant

rightPanel.Controls.Clear(); 
     marketMessageLabel = new Label(); 
     marketMessageLabel.Location = new Point(0, 20);    
     marketMessageLabel.AutoSize = false; 
     marketMessageLabel.Size = new Size(rightPanel.Width, 42); 
     marketMessageLabel.BackColor = Color.White;    
     marketMessageLabel.Font = new System.Drawing.Font("Verdana", 8.00F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 
     rightPanel.Controls.Add(marketMessageLabel);       

     signinUserNameLabel = new Label(); 
     signinUserNameLabel.Location = new Point(0, 150); 
     signinUserNameLabel.Size = new Size(60, 14); 
     signinUserNameLabel.BackColor = Color.White; 
     signinUserNameLabel.Text = "User Name";    
     signinUserNameLabel.Font = new System.Drawing.Font("Verdana", 9.00F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 
     rightPanel.Controls.Add(signinUserNameLabel); 

     signinUserNameTextBox = new TextBox(); 
     signinUserNameTextBox.Location = new Point(0, 170); 
     signinUserNameTextBox.Width = this.Width - 80; 
     signinUserNameTextBox.Font = new System.Drawing.Font("Verdana", 9.00F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));   
     signinUserNameTextBox.TabIndex = 0; 
     signinUserNameTextBox.TabStop = true; 

     rightPanel.Controls.Add(signinUserNameTextBox); 

     signinPasswordLabel = new Label(); 
     signinPasswordLabel.Location = new Point(0, 192); 
     signinPasswordLabel.Size = new Size(100, 14); 
     signinPasswordLabel.Font = new System.Drawing.Font("Verdana", 9.00F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 
     signinPasswordLabel.BackColor = Color.White; 
     signinPasswordLabel.Text = "Password";    
     rightPanel.Controls.Add(signinPasswordLabel);      

     signinPasswordTextBox = new TextBox(); 
     signinPasswordTextBox.Location = new Point(0, 210); 
     signinPasswordTextBox.Width = this.Width - 80;    
     signinPasswordTextBox.PasswordChar = '*'; 
     signinPasswordTextBox.TabIndex = 1; 
     signinPasswordTextBox.TabStop = true; 
     rightPanel.Controls.Add(signinPasswordTextBox); 

     signInButton = new Button(); 
     signInButton.Text = "Sign In"; 
     signInButton.Font = new System.Drawing.Font("Verdana", 9.00F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 
     signInButton.Width = 70;    
     signInButton.BackColor = Color.White; 
     signInButton.Location = new Point(0,240); 
     signInButton.Click += new EventHandler(signInButton_Click); 
     signInButton.TabIndex = 2; 
     signInButton.TabStop = true; 
     rightPanel.Controls.Add(signInButton); 
+0

Utilisez à la place un contrôle UserControl. Et n'utilisez pas Clear() sans appeler Dispose() sur les contrôles enfants, il fuit définitivement les poignées de la fenêtre de contrôle. –

Répondre

0

Assurez-vous que vous définissez la tabindex pour les étiquettes aussi, malgré ce n'est pas focalisable.

De VS fenêtre concepteur, avec votre formulaire à l'écran dans la conception plus, cliquez sur

  • Voir Menu
  • Tab option de menu de commande
point de

et cliquez pour définir l'ordre séquentiel des contrôles (y compris les étiquettes).

Espérons que cela aide, Cordialement, Tom.

1

La solution définit TabStop = true sur le panneau. Je viens de faire un petit test, et il semble que les winforms ne se verrouillent pas dans le panneau enfant s'il n'y a pas d'autres contrôles pouvant être mis au point à l'extérieur du panneau.

Vous n'obtiendrez pas de tabulation "sur" le panneau, mais cela vous permet de contourner ce problème et il sera tabulé pour son premier contrôle enfant.

5

Un autre problème possible est si le formulaire où la "tabulation" ne fonctionne pas est sur un formulaire qui n'est pas affiché modalement. Pour certaines raisons, "tabulation" ne fonctionne parfois pas si un formulaire enfant est affiché avec .show et que vous préférez afficher le formulaire avec .ShowDialog.

+0

'.ShowDialog' fonctionne pour moi. –

+0

J'ai trouvé que si j'appelle Application.Run() après form.Show() la tabulation fonctionnera. Je pense que cela a à voir avec la boucle de messagerie Windows ne pas être implémentée automatiquement par form.show() – Dowlers

1

Si le formulaire est modales (affichée avec .Show()), vous devez ajouter le code suivant pour gérer l'événement keyDown:

private void YourForm_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyCode == Keys.Tab) 
     { 
      if (e.Modifiers == Keys.Shift) 
       this.ProcessTabKey(false); 
      else 
       this.ProcessTabKey(true); 
     } 
    } 

Vous devez également définir la propriété KeyPreview sur True.