作者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/cn.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