private void button1_Click(object sender, System.EventArgs e)
{
for(int i=0;i<400;i++)
{
textBox1.Text = i.ToString();
System.Threading.Thread.Sleep(?);//延时一定时间 ?的单位ms
}
}
{
for(int i=0;i<400;i++)
{
textBox1.Text = i.ToString();
System.Threading.Thread.Sleep(?);//延时一定时间 ?的单位ms
}
}
static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
int i=0;
再到Form_load事件里面写
myTimer.Interval = 1000;
myTimer.Start();
myTimer.Tick += new EventHandler(TimerEventProcessor);
最后加上这个事件
private void TimerEventProcessor(Object myObject,EventArgs myEventArgs)
{
if(i<400)
{
textBox1.Text = i.ToString();
i++;
}
else
i=0;
}
比如
点一个button改变textbox的值,然后再执行一段可能比较耗费时间的代码,在VB和VC中都立即可以看到textbox的值改变了,但是c#就必须等所有的程序运行完了以后才能看到textbox的值。有没有好一点的办法解决这个问题?如果要做一个安装文件的进度条,总不能进度条变长一点就要在延时几秒在运行后面的安装过程吧。
for语句怎么执行的好好的看看啊,是在内部循环,电脑执行的那么块。楼主现在没搞明白代码的执行。int i=0
while(i<=400)
{
textBox1.Text = i.ToString();
i++
}
打个比方,
如果form上有10000个textbox控件,代码中有给这10000个控件赋值的代码,如
textbox1.text = "haha";
textbox2.text = "hehe";
textbox3.text = "xixi";
...
...
...
textbox10000.text = "lala";程序的运行结果是你只能直接看到10000个控件同时改变了值,而不是程序赋值以后立即改变。
这个在vb vc里都是立即改变的。不知道我这样说能不能明白。
如果想显示,就必须强制控件显示.textBox1->Refresh();
或者用TImer的方式
强制控件刷新
我在做大批量数据导入时,就是这么解决显示当前正在导入的数据的ID等信息的!
实时显示!private void button1_Click(object sender, System.EventArgs e)
{
for(int i=0;i<400;i++)
{
textBox1.Text = i.ToString();
textBox1.Refresh();
}
}
用for不行 。。
qiuzhongyu(省油的灯) 是不错,不过sleep让人感觉起来程序
跟死了一样。 最还还是timer !
{
for(int i=0;i<400;i++)
{
textBox1.Text = i.ToString();
Application.DoEvents();//这里加这一句就可以了.
//用Sleep()有点费时间,不太好.
//用Refresh();程序运行时有点假死机的现象.不太好.
}
}
我前几天在做一个程序时,都试了一下,感觉Refresh()较好.
或者this.Refresh();都可以,不过这两条语句适用情况不一样。
如果textBox1.text改变过之后,再执行一段代码,然后再改变textBox2.text,那么就写:textBox1.Refresh;
如果执行代码之后改变所有textBox的text,然后再执行一段,再更改所有textBox,安么就写:this.Refresh
private void button1_Click(object sender, System.EventArgs e)
{
for(int i=0;i<400;i++)
{
textBox1.Text = i.ToString();
Application.DoEvents();//这里加这一句就可以了.
System.Threading.Thread.Sleep(100);
}
}
textBox1.Text = (i++).ToString();
{
for(int i=0;i<400;i++)
{
textBox1.Text = textBox1.Text + i.ToString();
System.Threading.Thread.Sleep(?);//延时一定时间 ?的单位ms
}
}
private void button2_Click(object sender, System.EventArgs e)
{
for(int i =0;i<600;i++)
{
label1.Text = i.ToString();
System.Threading.Thread.Sleep(10);
label1.Refresh();
}
}当然,有一点,因为处理的过程是写在button.click里的,执行的时候,就无法响应别的了。建议楼主改改想法,按钮只触发一下就行,累加给另一线程做。