2008-10-22 13 views
2

J'ai une petite démonstration ci-dessous d'un problème particulier.Question sur une percepiarité d'événement dans un TabControl

using System; 
using System.Windows.Forms; 

namespace WindowsApplication1 
{ 
    public class TestForm : Form 
    { 
     private System.Windows.Forms.TabControl tabControl1; 
     private System.Windows.Forms.TabPage tabPage1; 
     private System.Windows.Forms.TabPage tabPage2; 
     private System.Windows.Forms.TextBox textBox1; 

     public TestForm() 
     { 
      //Controls 
      this.tabControl1 = new System.Windows.Forms.TabControl(); 
      this.tabPage1 = new System.Windows.Forms.TabPage(); 
      this.tabPage2 = new System.Windows.Forms.TabPage(); 
      this.textBox1 = new System.Windows.Forms.TextBox(); 

      // tabControl1 
      this.tabControl1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 
         | System.Windows.Forms.AnchorStyles.Left) 
         | System.Windows.Forms.AnchorStyles.Right))); 
      this.tabControl1.Controls.Add(this.tabPage1); 
      this.tabControl1.Controls.Add(this.tabPage2); 
      this.tabControl1.Location = new System.Drawing.Point(12, 12); 
      this.tabControl1.Name = "tabControl1"; 
      this.tabControl1.SelectedIndex = 0; 
      this.tabControl1.Size = new System.Drawing.Size(260, 240); 
      this.tabControl1.TabIndex = 0; 
      this.tabControl1.Selected += new System.Windows.Forms.TabControlEventHandler(this.tabControl1_Selected); 

      // tabPage1 
      this.tabPage1.Controls.Add(this.textBox1); 
      this.tabPage1.Location = new System.Drawing.Point(4, 22); 
      this.tabPage1.Name = "tabPage1"; 
      this.tabPage1.Size = new System.Drawing.Size(252, 214); 
      this.tabPage1.TabIndex = 0; 
      this.tabPage1.Text = "tabPage1"; 

      // tabPage2 
      this.tabPage2.Location = new System.Drawing.Point(4, 22); 
      this.tabPage2.Name = "tabPage2"; 
      this.tabPage2.Size = new System.Drawing.Size(192, 74); 
      this.tabPage2.TabIndex = 1; 
      this.tabPage2.Text = "tabPage2"; 

      // textBox1 
      this.textBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 
         | System.Windows.Forms.AnchorStyles.Right))); 
      this.textBox1.Location = new System.Drawing.Point(6, 38); 
      this.textBox1.Name = "textBox1"; 
      this.textBox1.Size = new System.Drawing.Size(240, 20); 
      this.textBox1.TabIndex = 0; 

      // TestForm 
      this.ClientSize = new System.Drawing.Size(284, 264); 
      this.Controls.Add(this.tabControl1); 
      this.Name = "Form1"; 
      this.Text = "Form1"; 
     } 

     //Tab Selected 
     private void tabControl1_Selected(object sender, EventArgs e) 
     { 
      this.Text = "TextBox Width: " + this.textBox1.Width.ToString(); 
     } 
    } 

    //Main 
    static class Program 
    { 
     static void Main() 
     { 
      Application.Run(new TestForm()); 
     } 
    } 

} 

Si vous exécutez le code ci-dessus C# vous aurez une petite forme contenant un tabcontrol. Dans le tabcontrol est une texbox sur le premier onglet. Si vous suivez ces étapes, vous verrez le problème:

  1. Sélectionnez TabPage2 (largeur de textBox1 est rapporté dans le titre du formulaire)
  2. Redimensionner la forme
  3. Sélectionnez TabPage1 (La mauvaise largeur de textBox1 est rapporté)

Des idées ce qui se passe ici? La zone de texte est évidemment plus grande que ce qui est rapporté. Si vous cliquez à nouveau sur tabPage2, la taille correcte est alors mise à jour. Évidemment, il y a un événement mettant à jour la largeur de textBox1. Puis-je déclencher cela lorsque tabPage1 est sélectionné?

+0

Il était facile de reproduire votre problème. Bonne question. – Hallgrim

Répondre

2

Tout d'abord, merci pour le programme complet - il a fait beaucoup plus facile de travailler sur ce qui se passait!

Bien que la zone de texte ne soit pas visible, elle n'est pas redimensionnée. Lorsque vous sélectionnez tabPage1, l'événement Selected déclenche avant les contrôles deviennent visibles et la zone de texte est redimensionnée. Maintenant, c'est pour ça que ça se passe - mais quelle est ta situation réelle? Si vous souhaitez capturer la taille des contrôles, abonnez-vous à leurs événements Redimensionner. Si non, pourriez-vous expliquer plus sur ce que vous essayez d'atteindre?

+0

Jon, j'ai besoin d'apprendre beaucoup de toi. Je n'ai pas pensé à la façon dont les événements Windows fonctionneraient. Cela a du sens. La peinture de la zone de texte n'apparaîtra qu'après la fin de l'événement de sélection tabPage, je suppose. Merci beaucoup pour votre précision. – shahkalpesh

+0

Pas de problème. Cela ne vous aide pas à contourner le problème si ... Si vous attachez un gestionnaire d'événement à tabPage1.VisibleChanged qui l'obtient au bon point, ce qui * pourrait * vous aider ... –

+0

Merci, cela a vraiment aidé un lot! J'utilise un panneau de contrôle comme un conteneur pour les contrôles douaniers qui sont disposés en fonction de sa largeur. Il n'était pas mis à jour en raison de la largeur signalée incorrectement. S'abonner à l'événement de redimensionnement du panneau résout ceci. Des trucs simples, je ne peux pas croire que je l'ai manqué –

-1

Je ne sais pas si je comprends le problème. Toutefois, vous pouvez utiliser l'événement de redimensionnement de textbox pour capturer le changement de largeur OU le redimensionnement du formulaire.

Dans votre exemple, l'événement select de tabPage1 se déclenche-t-il lorsque vous effectuez l'étape 3?

+0

L'événement select se déclenche, mais avant que la page à onglets ne soit rendue visible, la taille de la zone de texte est recalculée. –

1

Je suis assez sûr que ce qui se passe est l'événement Selected est levée légèrement avant que la page à onglet ne soit visible. La zone de texte n'est pas redimensionnée tant que la page à onglet n'est pas visible. Vous devez donc vérifier la taille de la zone de texte avant de la redimensionner. Lorsque vous modifiez à nouveau les onglets, la zone de texte est déjà redimensionnée, de sorte que vous obtenez la valeur correcte.

Modifiez les dernières lignes de votre formulaire exemple pour ressembler à ceci et il deviendra évident:

  this.textBox1.SizeChanged += TextboxSizeChanged; 
     } 

     //Tab Selected 
     private void tabControl1_Selected(object sender, EventArgs e) 
     { 
      System.Diagnostics.Debug.WriteLine("tab selected"); 
      this.Text = "TextBox Width: " + this.textBox1.Width.ToString(); 
     } 

     private void TextboxSizeChanged(object sender, EventArgs e) 
     { 
      System.Diagnostics.Debug.WriteLine("Textbox resized"); 
     }
+0

Merci pour l'exemple. –

1

Si vous modifiez votre code un peu en ajoutant un gestionnaire d'événements à l'événement textbox1.Resize vous voulez voir ce qui se passe. L'événement tabPage1.Selected se produit avant le redimensionnement des contrôles de la page à onglet. Lorsque vous vérifiez la largeur de la zone de texte, vous le vérifiez avant de le redimensionner.

Normalement, ce ne serait pas un problème, car le redimensionnement est fait correctement par la suite, mais je suppose que vous utiliserez la taille de la zone de texte pour quelque chose?

Vous devriez pouvoir écrire votre propre TabControl qui résout ce problème, mais vous devrez expérimenter pour voir ce qui fonctionne ici.