有关选项卡控件中的事件性能的问题
本文关键字:事件 性能 问题 控件 选项 | 更新日期: 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# 代码,您将拥有一个包含选项卡控件的小窗体。选项卡控件中的第一个选项卡上有一个文本框。如果按照以下步骤操作,您将看到问题:
- 选择 tabPage2(文本框 1 的宽度在窗体标题中报告)
- 调整窗体大小
- 选择 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 的选择事件?