C#为什么TextChanged事件采用之前的宽度?

C#为什么TextChanged事件采用之前的宽度?,c#,winforms,C#,Winforms,在我的winforms应用程序中,有一些代码需要在文本更改后执行。标签上有一个textchanged事件,代码如下: string value = lblText.Text; int labelWidth = lblText.Width; int controlWidth = groupPanel1.Width; int difference = controlWidth - labelWidth; lblText.Left = difference / 2; 当我在string valu

在我的winforms应用程序中,有一些代码需要在文本更改后执行。标签上有一个textchanged事件,代码如下:

string value = lblText.Text;
int labelWidth = lblText.Width;
int controlWidth = groupPanel1.Width;

int difference = controlWidth - labelWidth;

lblText.Left = difference / 2;
当我在
string value=lblText.Text设置断点时我看到了正确的值。但是width属性返回文本属性上一个值的宽度

例如:

第一次:text=“hello world!”宽度:0

第二次:text=“h”宽度:60

第三次:text=“hi”宽度:13


怎么可能呢?

如果这是一个启用了autosize属性的标签,那么它将在绘制事件后重新安装。看起来您正在更改文本并请求新的宽度,但没有在绘制后请求,因此它仍然具有最后一个宽度。

如果该标签启用了autosize属性,则它将在绘制事件后重新安装。看起来您正在更改文本并请求新的宽度,但没有在绘制后请求,因此它仍然具有最后的宽度。

您应该使用类似的方式(您的代码移动到委派):


将此代码放在TextChanged处理程序中。

您应该使用类似的方法(将代码移动到委派):



将此代码放入TextChanged处理程序。

如果这是Windows窗体问题,为什么要将其标记为“asp.net”?也添加MS Access。可能有一些C#开发人员在那里。@Mark:我很抱歉。我现在已经更改了,如果这是Windows窗体问题,为什么会标记为“asp.net”?也添加MS Access。可能有一些C#开发人员在那里。@Mark:我很抱歉。我现在已经更改了,所以基本上你要说的是,文本属性已经更改,但是标签还没有重新绘制,这就是为什么我有上一个值的宽度?是的,你需要在再次绘制后检查该值。您更改了文本值,这将引发标签的重新绘制事件,但在执行之前,它将保持不变?在那之后,我可以得到正确的宽度?是的,无效,刷新,或者任何对控件进行重新绘制的函数…所以基本上你说的是,文本属性被更改了,但是标签还没有重新绘制,这就是为什么我有上一个值的宽度?是的,你需要在再次绘制后检查该值。您更改了文本值,这将引发标签的重新绘制事件,但在执行之前,它将保持不变?在那之后,我可以得到正确的宽度?是的,无效,刷新,或者任何使控件重新绘制的函数…我很抱歉。我只是一个初级程序员,我不完全理解这段代码。我应该把代码放在哪里?我该如何使用它?Martijn,我已经更改了代码,向您展示了所有事件处理程序的主体。对不起。我只是一个初级程序员,我不完全理解这段代码。我应该把代码放在哪里?如何使用它?Martijn,我已经更改了代码,向您展示了所有事件处理程序的主体。
private void label1_TextChanged(object sender, EventArgs e) {
    this.BeginInvoke(new Action(delegate {
        string value = lblText.Text;
        int labelWidth = lblText.Width;
        int controlWidth = groupPanel1.Width;
        int difference = controlWidth - labelWidth;
        lblText.Left = difference / 2;
                    this.Text = label1.Width.ToString();
    }));
}