Вопрос

Ниже у меня есть небольшая демонстрация специфической проблемы.

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

}

Если вы запустите приведенный выше код на C #, у вас будет небольшая форма, содержащая tabcontrol.Внутри tabcontrol находится текстовое поле на первой вкладке.Если вы выполните эти действия, то увидите проблему:

  1. Выберите tabPage2 (ширина TextBox1 указана в заголовке формы).
  2. Измените размер формы
  3. Выберите tabPage1 (указывается неправильная ширина текстового поля1).

Есть какие-нибудь идеи, что здесь происходит?Текстовое поле, очевидно, больше того, о чем сообщается.Если вы снова нажмете на tabPage2, правильный размер будет обновлен.Очевидно, что происходит событие, обновляющее ширину TextBox1.Могу ли я активировать это при выборе tabPage1?

Это было полезно?

Решение

Во-первых, спасибо за полную программу - она сделала это многое легче разобраться в том, что происходит!

Хотя текстовое поле не отображается, его размер не изменяется.Когда вы выбираете tabPage1, срабатывает выбранное событие до того, как элементы управления становятся видимыми, и текстовое поле снова отображается.

Вот почему это происходит - но какова ваша реальная ситуация?Если вы действительно хотите фиксировать изменение размера элементов управления, подпишитесь на их события изменения размера.Если нет, не могли бы вы подробнее рассказать о том, чего вы пытаетесь достичь?

Другие советы

Я уверен, что происходит событие Selected , которое вызывается до того, как закладка становится видимой. Размер текстового поля не изменяется до тех пор, пока страница вкладки не станет видимой, поэтому вы в конечном итоге проверяете значение размера текстового поля до того, как оно будет фактически изменено. При повторном изменении вкладок размер текстового поля уже изменяется, поэтому вы получаете правильное значение.

Измените последние несколько строк формы примера так, чтобы это выглядело следующим образом:

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

Если вы немного измените свой код, добавив обработчик событий в событие textbox1.Resize, вы увидите, что происходит. Событие tabPage1.Selected наступает до изменения размеров элементов на вкладке, поэтому при проверке ширины текстового поля вы проверяете его перед изменением размера.

Обычно это не будет проблемой, так как после этого изменение размера будет выполнено правильно, но я думаю, что вы для чего-то будете использовать размер текстового поля?

Вы должны быть в состоянии написать свой собственный TabControl, который решает эту проблему, но вам придется поэкспериментировать, чтобы увидеть, что работает здесь.

Не уверен, что понимаю проблему. Но вы можете использовать событие изменения размера текстового поля для захвата изменения ширины ИЛИ изменения размера формы.

В вашем примере срабатывает событие select tabPage1 при выполнении шага 3?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top