不能更改对象上的文本

本文关键字:文本 对象 不能 | 更新日期: 2023-09-27 18:17:50

我似乎无法改变任何对象上的文本-到目前为止,我已经尝试了标签和按钮。为什么这行不通呢?

    void Button1Click(object sender, EventArgs e)
    {
        for(int i = 60; i >=1; i--){
            Thread.Sleep(1000);
            i -= 1;
            label1.Text = i.ToString();
        }
    }

不能更改对象上的文本

这不起作用,因为您正在使用忙循环来更新文本。

这段代码在主线程中运行,所以它要花整整一分钟的时间来设置Text属性,而不能更新用户界面。

您将使用计时器来更新文本,以便主线程在更改之间重新获得控制权。

尝试执行Thread.Sleep()命令,查看标签是否已更新。你可能会发现UI线程退出了函数,即使你请求它休眠。

你能做的是使用定时器控制,并将间隔设置为1000(1秒)。然后可以设置label1。文本到计数器或静态字段值(或隐藏字段)。

只要你呆在Button1Click UI线程接缝睡觉。删除Thread.Sleep,您将看到文本显示在标签中。

Application.DoEvents();放在代码的最后一行之后,那么它肯定会工作。

       for (int i = 60; i >= 1; i--)
        {
            Thread.Sleep(1000);
            i -= 1;
            label1.Text = i.ToString();
            Application.DoEvents();
        } 

首先,你必须学习如何:使线程安全调用Windows窗体控件。

你需要创建一个线程并使用Invoke delegate。

Thread th = new Thread(test);
th.Start();  //start the thread

这个方法将更新label .text

void test()
{
    for (int i = 60; i >= 1; i--)
    {
        Thread.Sleep(1000);
        if (label1.InvokeRequired)
        {
            label1.Invoke(new Action(()  => {
                label1.Text = i.ToString();
            }));
        }
    }
}