Не можете изменить текст на объекте? - PullRequest
2 голосов
/ 15 декабря 2011

Кажется, я не могу изменить текст на каком-либо объекте - я уже пробовал как надписи, так и кнопки.Почему это не работает?

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

Ответы [ 5 ]

4 голосов
/ 15 декабря 2011

Это не работает, потому что вы используете занятый цикл для обновления текста.

Этот код выполняется в главном потоке, поэтому он занят настройкой свойства Text целую минуту и ​​не может обновить пользовательский интерфейс.

Вы бы использовали таймер для обновления текста, чтобы основной поток восстанавливал управление между изменениями.

0 голосов
/ 15 декабря 2011

Прежде всего вы должны научиться Как: выполнять потокобезопасные вызовы элементов управления Windows Forms .

Вам необходимо создать поток и использовать делегат 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();

            }));

        }
    }
}
0 голосов
/ 15 декабря 2011

вставьте Application.DoEvents(); в ваш код после последней строки, тогда он будет работать наверняка.

       for (int i = 60; i >= 1; i--)
        {
            Thread.Sleep(1000);
            i -= 1;
            label1.Text = i.ToString();
            Application.DoEvents();
        } 
0 голосов
/ 15 декабря 2011

Пока вы остаетесь в Button1Click, поток пользовательского интерфейса кажется спящим.Удалите Thread.Sleep, и вы увидите, что текст отображается в метках.

0 голосов
/ 15 декабря 2011

Попробуйте вывести команду Thread.Sleep (), чтобы проверить, обновлена ​​ли метка.Вы можете обнаружить, что поток пользовательского интерфейса выходит из функции, даже если вы просили его перевести в режим сна.

Что вы можете сделать, это использовать элемент управления Timer и установить интервал 1000 (1 секунда).Затем вы можете установить для label1.Text значение счетчика или статического поля (или скрытого поля).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...