2

我在下面有一个特殊问题的小演示。

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 内是第一个选项卡上的 texbox。如果您按照以下步骤操作,您将看到问题:

  1. 选择tabPage2(表单标题中报textBox1的宽度)
  2. 调整表格大小
  3. 选择tabPage1(报错textBox1宽度)

有什么想法吗?文本框显然比报告的要大。如果再次单击 tabPage2,则会更新正确的大小。显然有一个事件更新 textBox1 的宽度。我可以在选择 tabPage1 时触发它吗?

4

4 回答 4

2

首先,感谢您提供完整的程序 - 它使您容易弄清楚发生了什么!

虽然文本框不可见,但不会调整大小。当您选择 tabPage1 时,Selected 事件会在控件变得可见之前触发,并且文本框会再次布局。

现在,这就是它发生的原因——但你的真实情况是什么?如果您真的想捕捉控件的大小变化,请订阅它们的 Resize 事件。如果没有,你能解释更多关于你想要达到的目标吗?

于 2008-10-22T20:57:26.893 回答
1

我很确定正在发生的事情是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");
        }
于 2008-10-22T20:58:45.987 回答
1

如果您通过向 textbox1.Resize 事件添加事件处理程序来稍微修改您的代码,您将看到会发生什么。tabPage1.Selected 事件发生在标签页中的控件调整大小之前,因此当您检查文本框的宽度时,您是在调整其大小之前对其进行检查。

通常这不会是一个问题,因为调整大小是在之后正确完成的,但我猜你会使用文本框的大小来做一些事情?

您应该能够编写自己的 TabControl 来解决此问题,但您必须进行试验才能看到这里的工作原理。

于 2008-10-22T21:14:20.620 回答
-1

不知道我是否理解这个问题。但是,您可以使用文本框的调整大小事件来捕获宽度更改或表单的调整大小。

在您的示例中,当您执行第 3 步时,tabPage1 的选择事件是否会触发?

于 2008-10-22T20:56:44.290 回答