Вопрос об особенностях события в TabControl - PullRequest
2 голосов
/ 23 октября 2008

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

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 (сообщается о неправильной ширине textBox1)

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

Ответы [ 4 ]

2 голосов
/ 23 октября 2008

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

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

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

1 голос
/ 23 октября 2008

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

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

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

1 голос
/ 23 октября 2008

Я почти уверен, что происходит событие 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");
        }
0 голосов
/ 23 октября 2008

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

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

...