Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 关于TabControl中事件感知的问题_C#_Winforms_Event Handling_Tabcontrol - Fatal编程技术网

C# 关于TabControl中事件感知的问题

C# 关于TabControl中事件感知的问题,c#,winforms,event-handling,tabcontrol,C#,Winforms,Event Handling,Tabcontrol,下面我有一个特殊问题的小例子 using System; using System.Windows.Forms; namespace WindowsApplication1 { public class TestForm : Form { private System.Windows.Forms.TabControl tabControl1; private System.Windows.Forms.TabPage tabPage1;

下面我有一个特殊问题的小例子

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中,第一个选项卡上有一个文本框。如果按照以下步骤操作,您将看到问题:

选择选项卡Page2 textBox1的宽度在表单标题中报告 调整窗体大小 选择tabPage1报告的文本框宽度错误
你知道这是怎么回事吗?文本框显然比报告的要大。如果再次单击tabPage2,则会更新正确的大小。显然,有一个事件正在更新textBox1的宽度。选择tabPage1时是否可以触发此操作?

不确定我是否理解此问题。 但是,您可以使用textbox的resize事件来捕获宽度更改或窗体的resize


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

首先,感谢您完成了完整的程序-它使了解发生了什么变得更加容易

虽然文本框不可见,但不会调整大小。选择tabPage1时,所选事件将在控件可见和文本框再次布局之前触发


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

我很确定,所选事件会在选项卡页面显示之前被略微提升。在选项卡页面变为可见之前,文本框不会调整大小,因此在实际调整文本框大小之前,您将检查文本框大小的值。再次更改选项卡时,文本框的大小已经调整,因此可以获得正确的值

将示例表单的最后几行更改为如下所示,它将变得明显:

            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来解决此问题,但您必须进行实验才能看到这里的效果。

select事件确实会触发-但在tab页面实际可见之前,这会导致重新计算文本框大小。Jon,我需要从您那里学到很多东西。我没有想到windows事件会如何工作。有道理。我想,文本框的绘制只会在tabPage选择事件完成后发生。谢谢你的严谨,没问题。但这并不能帮你解决这个问题。。。如果您将一个事件处理程序附加到tabPage1.VisibleChanged,它将在正确的位置获得它,这可能会对您有所帮助…谢谢,这真的帮助很大!我使用面板控件作为海关控件的容器,根据其宽度进行布局。由于报告的宽度不正确,因此未进行更新。订阅面板的resize事件可以解决此问题。简单的东西,真不敢相信我错过了它很容易重现你的问题。好问题。