Pregunta

Tengo una pequeña demostración a continuación de un problema peculiar.

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 ejecuta el código C # anterior, tendrá un formulario pequeño que contiene un control de tabulación. Dentro del control de tabulación hay un cuadro de texto en la primera pestaña. Si sigues estos pasos, verás el problema:

  1. Seleccione tabPage2 (el ancho de textBox1 se informa en el título del formulario)
  2. Cambiar el tamaño del formulario
  3. Seleccione tabPage1 (se informa el ancho incorrecto de TextBox1)

¿Alguna idea de lo que está pasando aquí? El cuadro de texto es obviamente más grande de lo que se informa. Si vuelves a hacer clic en tabPage2, se actualiza el tamaño correcto. Obviamente hay un evento que actualiza el ancho de textBox1. ¿Puedo activar esto cuando se selecciona tabPage1?

¿Fue útil?

Solución

En primer lugar, gracias por el programa completo, ¡lo hizo mucho más fácil de resolver lo que estaba sucediendo!

Si bien el cuadro de texto no está visible, no se redimensiona. Cuando selecciona tabPage1, el evento Selected se dispara antes , los controles se vuelven visibles y el cuadro de texto se distribuye nuevamente.

Ahora, es por eso que está sucediendo, pero ¿cuál es tu situación real? Si realmente desea capturar el tamaño de los controles cambiando, suscríbase a sus eventos de cambio de tamaño. Si no, ¿podría explicar más sobre lo que está tratando de lograr?

Otros consejos

Estoy bastante seguro de que lo que está sucediendo es que el evento Selected se levanta ligeramente antes de que la página de la pestaña se haga visible. El cuadro de texto no cambia de tamaño hasta que la pestaña se vuelve visible, por lo que termina por verificar el valor del tamaño del cuadro de texto antes de que se cambie de tamaño. Cuando vuelves a cambiar las pestañas, el cuadro de texto ya está redimensionado, por lo que obtienes el valor correcto.

Cambie las últimas líneas de su formulario de ejemplo para que se vea así y se hará 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");
        }

Si modificas un poco tu código agregando un controlador de eventos al evento textbox1.Resize, verás lo que sucede. El evento tabPage1.Selected se produce antes de que se cambie el tamaño de los controles en la página de la pestaña, de modo que cuando verifique el ancho del cuadro de texto, lo verificará antes de cambiar su tamaño.

Normalmente, esto no sería un problema, ya que el cambio de tamaño se realiza correctamente después, ¿pero supongo que usarás el tamaño del cuadro de texto para algo?

Debería poder escribir su propio control de control de situación que solucione este problema, pero tendrá que experimentar para ver qué funciona aquí.

No estoy seguro si entiendo el problema. Pero, puede usar el evento de cambio de tamaño del cuadro de texto para capturar el cambio de ancho O el cambio de tamaño de la forma.

En su ejemplo, ¿se desencadena el evento de selección de tabPage1 cuando realiza el paso 3?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top