I have a little demonstration below of a peculiar problem.
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()); } } }
If you run the above C# code you will have a small form containing a tabcontrol. Within the tabcontrol is a texbox on the first tab. If you follow these steps you will see the problem:
- Select tabPage2 (textBox1’s width is reported in the form title)
- Resize the form
- Select tabPage1 (The wrong textBox1 width is reported)
Any ideas what is going on here? The textbox is obviously bigger than what is being reported. If you click again on tabPage2 the correct size is then updated. Obviously there is an event updating the width of textBox1. Can i trigger this when tabPage1 is selected?
Firstly, thanks for the complete program – it made it much easier to work out what was going on!
While the textbox isn’t visible, it isn’t resized. When you select tabPage1, the Selected event fires before the controls become visible and the textbox gets laid out again.
Now, that’s why it’s happening – but what’s your real situation? If you actually want to capture the size of controls changing, subscribe to their Resize events. If not, could you explain more about what you’re trying to achieve?