问题描述
for(inti=0;i<10;i++){label1.Text=i.ToString();}
这样写为什么不能动态显示呢,只有运行完了后显示一个9
解决方案
解决方案二:
label1.Text+=i.ToString();
解决方案三:
ps:这样只会直接显示0123456789要人肉眼可辨的0-->1-->2这样加上去,你得用backgroundworker
解决方案四:
因为程序运行太快了,你看不到你在循环里价格Thread.Sleep(1000);
解决方案五:
加个时间控件..每一秒变一个数
解决方案六:
引用3楼wangxm245的回复:
因为程序运行太快了,你看不到你在循环里价格Thread.Sleep(1000);
这样写的,也不会显示for(inti=0;i<100;i++){label1.Text=i.ToString();Thread.Sleep(1000);}
解决方案七:
加sleep,阻塞了,不会显示要么放timer里去,每秒+1,然后显示要么放线程里
解决方案八:
publicForm1(){InitializeComponent();Control.CheckForIllegalCrossThreadCalls=false;}ThreaddrawThread=null;privatevoidbutton1_Click(objectsender,EventArgse){closeThread();drawThread=newThread(newThreadStart(draw));drawThread.IsBackground=true;drawThread.Start();}privatevoiddraw(){try{for(inti=0;i<10;i++){label1.Text=i.ToString();Thread.Sleep(1000);}}catch(System.Exceptionex){MessageBox.Show("error");}closeThread();}//结束子线程privatevoidcloseThread(){if(drawThread!=null){if(drawThread.IsAlive){drawThread.Abort();}}}
起一个线程就好了
解决方案九:
引用5楼HQB313的回复:
Quote: 引用3楼wangxm245的回复:
因为程序运行太快了,你看不到你在循环里价格Thread.Sleep(1000);这样写的,也不会显示for(inti=0;i<100;i++){label1.Text=i.ToString();Thread.Sleep(1000);}
三楼说得没错,是运行得太快了,肉眼没法观察for(inti=0;i<100;i++){Thread.Sleep(1000);Application.DoEvents();label1.Text=i.ToString();}改变label1的文本会触发事件重绘Text,因为循环去改变所以程序已经帮你优化了不再执行触发事件重绘Text,也就是你说的显示不出来,加上Application.DoEvents();会让它继续执行触发事件,这时你就能看见了注意使用DoEvents()会出现哪些问题,自己查看相关资料
解决方案十:
不知道楼主想干嘛。想做进度条吗?亲,进度条不是这么做的。
解决方案十一:
引用9楼youzelin的回复:
不知道楼主想干嘛。想做进度条吗?亲,进度条不是这么做的。
就是想做一个简单的显示,现在循环到第几条数据了
解决方案十二:
引用10楼HQB313的回复:
Quote: 引用9楼youzelin的回复:
不知道楼主想干嘛。想做进度条吗?亲,进度条不是这么做的。就是想做一个简单的显示,现在循环到第几条数据了
还是进度啊,这是没有“条”了,亲,不带这么玩的。要找BackgroundWorker帮忙哦!
解决方案十三:
用timer控件,或者用子线程
解决方案十四:
用timer控件。一个timer控件+一个label控件usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Text;usingSystem.Windows.Forms;namespacegundong_Label{publicpartialclassForm1:Form{publicForm1(){InitializeComponent();button2.Enabled=false;}privatevoidtimer1_Tick(objectsender,EventArgse){label1.Left-=3;//设置label1左边缘与其容器的工作区左边缘之间的距离if(label1.Right<0)//当label1右边缘与其容器的工作区左边缘之间的距离小于0时{label1.Left=this.Width;//设置label1左边缘与其容器的工作区左边缘之间的距离为该窗体的宽度}}//开始演示privatevoidbutton1_Click(objectsender,EventArgse){timer1.Enabled=true;//开始滚动button2.Enabled=true;}//单击暂停按钮privatevoidbutton2_Click(objectsender,EventArgse){timer1.Enabled=false;//停止滚动button2.Enabled=false;}//退出privatevoidbutton3_Click(objectsender,EventArgse){this.Close();}}}
解决方案十五:
哦哦,不好意思,原来代码是不能附加样式的,本来想给这段关键代码加红色的哈,privatevoidtimer1_Tick(objectsender,EventArgse){label1.Left-=3;//设置label1左边缘与其容器的工作区左边缘之间的距离if(label1.Right<0)//当label1右边缘与其容器的工作区左边缘之间的距离小于0时{label1.Left=this.Width;//设置label1左边缘与其容器的工作区左边缘之间的距离为该窗体的宽度}}
解决方案:
引用11楼youzelin的回复:
Quote: 引用10楼HQB313的回复:
Quote: 引用9楼youzelin的回复:
不知道楼主想干嘛。想做进度条吗?亲,进度条不是这么做的。就是想做一个简单的显示,现在循环到第几条数据了
还是进度啊,这是没有“条”了,亲,不带这么玩的。要找BackgroundWorker帮忙哦!
for(inti=0;i<10;i++){i1=i;//前面定义了一个全局的i1backgroundWorker1.RunWorkerAsync();}privatevoidbackgroundWorker1_RunWorkerCompleted(objectsender,RunWorkerCompletedEventArgse){label1.Text.Text=ToString();}privatevoidbackgroundWorker1_DoWork(objectsender,DoWorkEventArgse){//这个地方不知道怎么写了}
解决方案:
楼上都说完了,我还能说什么呢
解决方案:
引用15楼HQB313的回复:
Quote: 引用11楼youzelin的回复:
Quote: 引用10楼HQB313的回复:
Quote: 引用9楼youzelin的回复:
不知道楼主想干嘛。想做进度条吗?亲,进度条不是这么做的。就是想做一个简单的显示,现在循环到第几条数据了
还是进度啊,这是没有“条”了,亲,不带这么玩的。要找BackgroundWorker帮忙哦!
for(inti=0;i<10;i++){i1=i;//前面定义了一个全局的i1backgroundWorker1.RunWorkerAsync();}privatevoidbackgroundWorker1_RunWorkerCompleted(objectsender,RunWorkerCompletedEventArgse){label1.Text=i1.ToString();}privatevoidbackgroundWorker1_DoWork(objectsender,DoWorkEventArgse){//这个地方不知道怎么写了}
这个要怎样写代码?
解决方案:
backgroundworker_dowork中要做的就是需要循环处理的代码。backgroundWorker1_RunWorkerCompleted是后台线程结束后,需要做的处理。
解决方案:
运行太快了,你看不到,用timer控件,在timer事件中添加给label赋值;设置timer的间隔事件;要么在原有for循环中添加threed.sleep(5000);//单位毫秒
解决方案:
并不是运行太快,是因为for(inti=0;i<10;i++){label1.Text=i.ToString();}
这段代码,会阻塞UI线程直到执行完毕才会刷新UI,如果是winform可以用Application.Doevents()方法。或者采用子线程,或者用Timer,总之都能解决。for(inti=0;i<10;i++){label1.Text=i.ToString();Application.Doevents();}
解决方案:
引用17楼HQB313的回复:
Quote: 引用15楼HQB313的回复:
Quote: 引用11楼youzelin的回复:
Quote: 引用10楼HQB313的回复:
Quote: 引用9楼youzelin的回复:
不知道楼主想干嘛。想做进度条吗?亲,进度条不是这么做的。就是想做一个简单的显示,现在循环到第几条数据了
还是进度啊,这是没有“条”了,亲,不带这么玩的。要找BackgroundWorker帮忙哦!
for(inti=0;i<10;i++){i1=i;//前面定义了一个全局的i1backgroundWorker1.RunWorkerAsync();}privatevoidbackgroundWorker1_RunWorkerCompleted(objectsender,RunWorkerCompletedEventArgse){label1.Text=i1.ToString();}privatevoidbackgroundWorker1_DoWork(objectsender,DoWorkEventArgse){//这个地方不知道怎么写了}
这个要怎样写代码?
是WinForm吗,是的话直接强制lab重绘就行了,用LaB_1.Refresh();就可以了....
解决方案:
.Net4.0最简单了。Task.Factory.StartNew(()=>{for(inti=0;i<10000000;i++){this.Dispatcher.Invoke(newAction(()=>{label1.Text=i.ToString();}));}});
解决方案:
循环显示1~100数字例子classprogram{staticvoidMain()//入口方法{for(inti=1;i<=100;i++)//开始for循环{System.Console.WriteLine(i);//输出i的值}System.Console.ReadLine();//等待回车继续}}//输出1~100数字