作者unfinish (笑吟吟的淫淫笑)
看板C_Sharp
標題[問題] 跑迴圈時怎麼即時更新label.text
時間Mon Oct 7 16:55:48 2019
假設程式有三個控制項
from1,label1,button1
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i <= 10; i++)
{
label1.Text = "" + i;
Thread.Sleep(1000);
}
}
本來期望看到執行的畫面會是
label1會從1,2,3....,10 每隔一秒加一加到十
不過實際上是等待10秒後
label1.Text會直接從預設的label1變成10
也就是說程式會直到button1_Click結束後才更新label1.Text
要怎麼做label1才會出現1,2,3....,10這樣的效果呢
好像只要是控制項就會有這問題 (textBox.Text也是一樣)
這現像應該在VB6就有了
因為我在寫VBA時就遇上
不過在不使用控制項直接寫入儲存格時(如 Range("A1")=i)
可以如我預期的那樣每秒更新
請問這個怎麼解決
謝謝大家
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.138.50.125 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_Sharp/M.1570438550.A.5DF.html
1F:推 TPNEW: 要在不同的thread做 10/07 17:05
2F:→ kobe8112: 控制項的文字只有UI執行緒可以變更,你應該如1樓建議, 10/07 18:13
3F:→ kobe8112: for迴圈、計算新值、睡覺這幾項另開執行緒執行, 10/07 18:13
4F:→ kobe8112: 僅有變更控制項文字這件事透過UI執行緒執行 10/07 18:14
5F:→ annies5: 試試 Application.DoEvents(); 10/07 19:01
6F:→ hijacker: 在這個例子裡只要在迴圈裡加label1.Update();就好啦 10/08 18:39
7F:→ hijacker: 不過通常不會這樣寫拉 因為Thread.Sleep(1000)會卡UI 10/08 18:40
8F:→ testPtt: 我只用inotifypropertychanged其他方法我不用 10/08 19:39
9F:→ spfy: 五樓的方式最簡單 不用學多執行緒怎麼寫 但效能會降很多很多 10/08 20:38
10F:推 Litfal: 不會用執行續就先學Timer怎麼用 10/09 01:06
11F:推 mepowerlmay: 五樓讚 會跑就好 10/17 00:35
12F:推 MephistoH: application.processmessage 10/22 13:43
13F:→ MephistoH: 不好意思..上面那個是delphi在用的 = = 10/22 13:45
14F:推 Nilife: Invoke? 10/29 06:42
15F:→ baseball0209: 在迴圈內加入label1.Refresh(),強制ui優先刷新 12/13 14:55