首页 新闻 会员 周边 捐助

Winform如何实现Label文本的动态变化?

0
[已解决问题] 解决于 2013-05-30 08:41

一个for循环语句如下
for(int i=0;i<10000;i++)
{
    this.label1.Text=i.toString();
}

运行后label只显示了最后结果,之间的结果我想是显示的,但是没有一种动态变化的效果,请问这个如何实现?问题也许很低端,还望赐教

问题补充:

for(int i=0;i<10000;i++)
{
    this.label1.Text=i.toString();

    this.label1.Refresh();//好像就可以解决  有那中动态变化的感觉
}

Time2Goo的主页 Time2Goo | 初学一级 | 园豆:197
提问于:2013-05-27 21:44
< >
分享
最佳答案
0

http://blog.csdn.net/ajrm0925/article/details/5314099

想用异步,建议看看这个!

奖励园豆:5
SeeMore | 菜鸟二级 |园豆:313 | 2013-05-29 22:42
其他回答(6)
0

其实是显示的,但是太快了亲,所以直接显示循环结束后的数据,可以在每次循环的时候设置下时间间隔就OK了。

Joevin | 园豆:230 (菜鸟二级) | 2013-05-27 22:59

顶起

支持(1) 反对(0) 会长 | 园豆:12463 (专家六级) | 2013-05-28 18:14
0

你需要做异步处理,

for(int i=0;i<10000;i++)
{
    this.label1.Text=i.toString();

  Application.DoEvents();
}

只会造轮子 | 园豆:2274 (老鸟四级) | 2013-05-27 23:20

+1

支持(2) 反对(0) TiestoRay | 园豆:687 (小虾三级) | 2013-05-28 08:07
0

简单方式用 Application.DoEvents()就可以了,但是这样用有严重后果

private void button1_Click(object sender, EventArgs e)
 { 
    // Clear the list
    listBox1.Items.Clear(); 
    
    // Get data from database or file 
    for (Int32 i = 0; i < 100000; i++)
    { 
      // Add the data to list 
      listBox1.Items.Add(i); 
      Application.DoEvents(); 
    }
 }

     运行上面的程序,先点击一次按钮,button1_Click被调用,listBox1.Items.Clear()清空列表,然后开始添加数据到列表。如果这个时候,我们再次点击按钮,一个Button Click消息被加入到消息队列。在没有调用Application.DoEvents时,这条新的消息只有在button1_Click处理完后,才会被调用。这样尽管界面有段时间没有响应,但list中的数据仍能保持完整。但当加入Application.DoEvents()后,在第一次处理button1_Click过程中,新的消息再次被处理,button1_Click第二次被调用,同样listBox1被清空。但是由于第一次的button1_Click还执行完,后面的Add动作仍会在第二次button1_Click都执行完成后执行,List就变成了1,2,3,4,5,6,4,5,6。而这种行为造成程序不稳定性,有时候数据是好的,有时候又有重复的数据。造成Reentrancy问题原因是由于DoEvents会处理消息队列中的所有消息,如果DoEvents能够提供只处理WM_Paint事件的话,就不会有这个问题。但是由于消息队列结构的设计不完全支持优先级,所以Win32或WinForm没法解决这个问题。

    所以要彻底解决这个问题就必须使用多线程,也就用到了委托,代码改成下面这样就可以使用了。关于多线程的知识还要去看看相关文章了解。

public Form1()
 {
    InitializeComponent();
    updateList = new UpdateUICallBack(UpdateList);
 }
 
 private void button1_Click(object sender, EventArgs e)
 {
    ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork));
 }
 
 private delegate void UpdateUICallBack(Int32 value);
 private UpdateUICallBack updateList;
 private void DoWork(Object state)
 {
    for (Int32 i = 0; i < 10000; i++)
    {
       updateList(i);
    }
 }
 
 private void UpdateList(Int32 value)
 {
    if (listBox1.InvokeRequired)
       listBox1.Invoke(updateList, new Object[] { value});
    else
       listBox1.Items.Add(value);
 }

 

根据LZ的需求,只需要把上面代码的UpdateList()中的listbox替换就可以了

WuRang | 园豆:1730 (小虾三级) | 2013-05-28 10:25

大哥。。。这个不要误导小盆友了!!!。。这个方法,是在无解1

支持(0) 反对(0) SeeMore | 园豆:313 (菜鸟二级) | 2013-05-29 22:43

不好意思说错话了。。。这个是线程池的,我还没用过,,抱歉!!

支持(0) 反对(0) SeeMore | 园豆:313 (菜鸟二级) | 2013-05-29 22:45

学习了。。。。之前的当我没说。。。哥哥,别生气啊,,不过你的第一个方法,实在是误导小盆友

支持(0) 反对(0) SeeMore | 园豆:313 (菜鸟二级) | 2013-05-29 22:46

@SeeMore: - -! 我没那么老。第一个方法不就是lz提出的问题么?

支持(0) 反对(0) WuRang | 园豆:1730 (小虾三级) | 2013-05-30 08:49
0

使用线程把,然后在里面来个睡觉。就可以了。

Supper_litt | 园豆:1036 (小虾三级) | 2013-05-28 11:02

哈哈。。。。这个回答好玩啊!!

支持(0) 反对(0) SeeMore | 园豆:313 (菜鸟二级) | 2013-05-29 22:38
1

用timer计时器也可以实现的,你新手,,应该还想不到线程,建议用timer先把效果实现了,等以后了解了在用线程

AStronghcm | 园豆:313 (菜鸟二级) | 2013-05-28 15:07

顶起

支持(0) 反对(0) 会长 | 园豆:12463 (专家六级) | 2013-05-28 18:14

新手完全支持用这个

支持(0) 反对(0) SeeMore | 园豆:313 (菜鸟二级) | 2013-05-29 22:38
0

for(int i=0;i<10000;i++)
{
this.label1.Text=i.toString();

this.label1.Refresh();

}
这个办法很有效

坐看昀起 | 园豆:206 (菜鸟二级) | 2019-09-27 18:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册