Domanda

Di seguito ho una piccola dimostrazione di un problema peculiare.

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());
        }
    }

}

Se esegui il codice C # sopra, avrai un piccolo modulo contenente un tabcontrol. All'interno del tabcontrol c'è un texbox nella prima scheda. Se segui questi passaggi vedrai il problema:

  1. Seleziona tabPage2 (la larghezza di textBox1 è riportata nel titolo del modulo)
  2. Ridimensiona il modulo
  3. Seleziona tabPage1 (viene indicata la larghezza di textBox1 errata)

Qualche idea su cosa sta succedendo qui? La casella di testo è ovviamente più grande di quanto viene segnalato. Se si fa di nuovo clic su tabPage2, la dimensione corretta viene quindi aggiornata. Ovviamente c'è un evento che aggiorna la larghezza di textBox1. Posso attivarlo quando è selezionato tabPage1?

È stato utile?

Soluzione

In primo luogo, grazie per il programma completo - ha reso molto più facile capire cosa stava succedendo!

Sebbene la casella di testo non sia visibile, non viene ridimensionata. Quando selezioni tabPage1, l'evento Selezionato viene attivato prima i controlli diventano visibili e la casella di testo viene nuovamente strutturata.

Ora, ecco perché sta accadendo, ma qual è la tua situazione reale? Se vuoi effettivamente catturare la dimensione dei controlli cambiando, iscriviti ai loro eventi di ridimensionamento. In caso contrario, potresti spiegare di più su ciò che stai cercando di ottenere?

Altri suggerimenti

Sono abbastanza sicuro che ciò che sta accadendo è l'evento Selected sollevato leggermente prima che la pagina della scheda diventi visibile. La casella di testo non viene ridimensionata fino a quando la pagina della scheda non diventa visibile, quindi si finisce per controllare il valore della dimensione della casella di testo prima che venga effettivamente ridimensionata. Quando si cambiano nuovamente le schede, la casella di testo viene già ridimensionata, quindi si ottiene il valore corretto.

Cambia le ultime righe del modulo di esempio in modo che appaia come questo e diventerà evidente:

            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");
        }

Se modifichi un po 'il codice aggiungendo un gestore di eventi all'evento textbox1.Resize vedrai cosa succede. L'evento tabPage1.Selected si verifica prima che i controlli nella pagina della scheda vengano ridimensionati, quindi quando si controlla la larghezza della casella di testo, la si controlla prima che venga ridimensionata.

Normalmente questo non sarebbe un problema, poiché il ridimensionamento viene eseguito correttamente dopo, ma suppongo che userete le dimensioni della casella di testo per qualcosa?

Dovresti essere in grado di scrivere il tuo TabControl che risolve questo problema, ma dovrai sperimentare per vedere cosa funziona qui.

Non sono sicuro di aver compreso il problema. Tuttavia, è possibile utilizzare l'evento di ridimensionamento della casella di testo per acquisire la modifica della larghezza o il ridimensionamento del modulo.

Nel tuo esempio, l'evento select di tabPage1 si attiva quando esegui il passaggio 3?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top