我在下面就一个特殊问题进行了一些演示。
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。如果您按照这些步骤操作,您将看到问题:
有什么想法在这里发生了什么?文本框明显大于报告的内容。如果再次单击tabPage2,则会更新正确的大小。显然有一个事件更新textBox1的宽度。我可以在选择tabPage1时触发吗?
答案 0 :(得分:2)
首先,感谢完整的程序 - 它让很多更容易弄清楚发生了什么!
虽然文本框不可见,但未调整大小。当您选择tabPage1时,Selected事件会在之前触发,控件变为可见,文本框会再次布局。
现在,这就是它发生的原因 - 但你的真实情况是什么?如果您确实希望捕获更改控件的大小,请订阅其Resize事件。如果没有,你能解释一下你想要达到的目标吗?
答案 1 :(得分: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");
}
答案 2 :(得分:1)
如果通过向textbox1.Resize事件添加事件处理程序来稍微修改代码,您将看到会发生什么。 tabPage1.Selected事件发生在选项卡页面中的控件调整大小之前,因此当您检查文本框的宽度时,您将在调整它之前调整它的大小。
通常情况下这不会有问题,因为之后调整大小正常,但我想你会使用文本框的大小来做什么?
您应该能够编写自己的TabControl来修复此问题,但您必须尝试查看此处的作用。
答案 3 :(得分:-1)
不确定我是否理解这个问题。 但是,您可以使用文本框的resize事件来捕获宽度更改或表单的大小调整。
在您的示例中,当您执行步骤3时,tabPage1的select事件是否会触发?