我在下面就一个特殊问题进行了一些演示。

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

  1. 选择tabPage2(textBox1的宽度在表单标题中报告)
  2. 调整表单大小
  3. 选择tabPage1(报告错误的textBox1宽度)
  4. 有什么想法在这里发生了什么?文本框明显大于报告的内容。如果再次单击tabPage2,则会更新正确的大小。显然有一个事件更新textBox1的宽度。我可以在选择tabPage1时触发吗?

有帮助吗?

解决方案

首先,感谢完整的程序 - 它让很多更容易弄清楚发生了什么!

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

现在,这就是它发生的原因 - 但你的真实情况是什么?如果您确实希望捕获更改控件的大小,请订阅其Resize事件。如果没有,你能解释一下你想要达到的目标吗?

其他提示

我很确定发生的事情是在标签页可见之前稍微提出 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来修复此问题,但您必须尝试查看此处的作用。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top