有关选项卡控件中的事件性能的问题

本文关键字:事件 性能 问题 控件 选项 | 更新日期: 2023-09-27 17:47:22

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

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# 代码,您将拥有一个包含选项卡控件的小窗体。选项卡控件中的第一个选项卡上有一个文本框。如果按照以下步骤操作,您将看到问题:

  1. 选择 tabPage2(文本框 1 的宽度在窗体标题中报告)
  2. 调整窗体大小
  3. 选择 tabPage1(报告了错误的文本框 1 宽度)

知道这里发生了什么吗?文本框显然比报告的内容大。如果再次单击 tabPage2,则会更新正确的大小。显然,有一个事件更新了文本框1的宽度。选择选项卡页 1 时是否可以触发此操作?

有关选项卡控件中的事件性能的问题

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

虽然文本框不可见,但不会调整大小。选择 tabPage1 时,将在控件变为可见之前触发"选定"事件,并再次对文本框进行布局。

现在,这就是它发生的原因 - 但你的真实情况是什么?如果确实要捕获控件更改的大小,请订阅其 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 添加事件处理程序来稍微修改代码。调整大小事件,您将看到会发生什么。tabPage1.Selected 事件发生在调整选项卡页中的控件大小之前,因此当您检查文本框的宽度时,您是在调整文本框大小之前检查它。

通常这不会有问题,因为之后会正确调整大小,但我想您会使用文本框的大小来做某事吗?

您应该能够编写自己的 TabControl 来解决此问题,但您必须进行试验才能看到此处有效的方法。

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

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