无法更改对象上的文本?

时间:2011-12-15 06:21:49

标签: c# labels

我似乎无法更改任何对象上的文本 - 到目前为止我已尝试过标签和按钮。为什么这不起作用?

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

5 个答案:

答案 0 :(得分:4)

它不起作用,因为您使用繁忙的循环来更新文本。

此代码在主线程中运行,因此它忙于设置Text属性一整分钟,并且无法更新用户界面。

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

答案 1 :(得分:0)

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

您可以使用Timer控件,并将间隔设置为1000(1秒)。然后,您可以将label1.Text设置为计数器或静态字段值(或隐藏字段)。

答案 2 :(得分:0)

只要你留在Button1Click UI线程接缝就要睡觉了。删除Thread.Sleep,您会看到文字显示在标签中。

答案 3 :(得分:0)

在最后一行之后将Application.DoEvents();放入您的代码中,然后它肯定会有效。

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

答案 4 :(得分:0)

首先,你必须学习How to: Make Thread-Safe Calls to Windows Forms Controls

您需要创建一个线程并使用Invoke委托。

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

此方法将更新lable.text

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

            }));

        }
    }
}