2011-12-15 8 views
2

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

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

Making сон UI нить это плохая идея. –

+0

@BrianRasmussen Я думаю, что OP просто пытается имитировать задачу с интенсивным процессором, используя 'Thread.Sleep (1000)' – Vamsi

ответ

0

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

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

4

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

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

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

0

До тех пор, пока вы остаетесь в штепселях UI, чтобы спать. Удалите Thread.Sleep, и вы увидите, что текст отображается на этикетках.

0

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

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

Вызов 'DoEvents' только один раз в секунду все равно заставит приложение казаться совершенно не реагирующим. Также обратите внимание, что он работает только в том случае, если есть только одна задача, например, если вы запускаете другую, пока первая работает, первая будет приостанавливаться, пока выполняется вторая. – Guffa

+0

, но теперь он работает, поэтому я дал это. –

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(); 

      })); 

     } 
    } 
} 
Смежные вопросы