Pergunta

Eu tenho um pouco de demonstração abaixo de um 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());
        }
    }

}

Se você executar o código C # acima, você terá um pequeno formulário contendo uma tabcontrol. Dentro do tabcontrol é um texbox na primeira guia. Se você seguir estas etapas que você vai ver o problema:

  1. Selecionar TabPage2 (largura de textBox1 é relatado no título do formulário)
  2. Redimensionar a forma
  3. Selecionar TabPage1 (A largura textBox1 errado é relatado)

Todas as idéias que está acontecendo aqui? A caixa de texto é, obviamente, maior do que o que está sendo relatado. Se você clicar novamente em TabPage2 o tamanho correto é então atualizado. Obviamente, há um evento atualizando a largura da textBox1. Posso acionar isso quando TabPage1 é selecionada?

Foi útil?

Solução

Em primeiro lugar, obrigado pelo programa completo - ele fez muito mais fácil de trabalhar para fora o que estava acontecendo

Enquanto a caixa de texto não é visível, não é redimensionada. Ao selecionar TabPage1, os incêndios evento selecionado antes os controles se tornam visíveis e caixa de texto fica estabelecidos novamente.

Agora, é por isso que está acontecendo - mas qual é a sua situação real? Se você realmente deseja capturar o tamanho dos controles de mudança, subscrever os seus eventos de redimensionamento. Se não, você poderia explicar mais sobre o que você está tentando alcançar?

Outras dicas

Eu tenho certeza que o que está acontecendo é o evento Selected é ligeiramente levantada antes da página da guia torna-se visível. A caixa de texto não é redimensionada até que a página da guia torna-se visível, assim você acaba verificando o valor do tamanho da caixa de texto antes que ele seja realmente redimensionada. Quando você altera guias novamente, a caixa de texto já é redimensionada, de modo a obter o valor correto.

Alterar as últimas linhas do seu formulário de exemplo para se parecer com isso e ela se tornará aparente:

            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 você modificar seu código um pouco, adicionando um manipulador de eventos para o evento textbox1.Resize você vai ver o que acontece. O evento tabPage1.Selected ocorre antes dos controles na página de separador é redimensionado assim quando você verificar a largura da caixa de texto que está a verificar-lo antes de ser redimensionada.

Normalmente, este não seria um problema, para o redimensionamento é feito corretamente depois, mas eu acho que você vai estar usando o tamanho da caixa de texto para alguma coisa?

Você deve ser capaz de escrever o seu próprio TabControl que corrige esse problema, mas você terá que experimentar para ver o que funciona aqui.

Não tenho certeza se eu entendi o problema. Mas, você pode usar o evento de redimensionamento da caixa de texto para capturar a mudança largura ou redimensionamento do formulário.

No seu exemplo, faz o evento seleto de TabPage1 fogo quando você faz o passo 3?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top