问题:
今天在写程序的时候,需要用到progressbar。以便用来显示写入数据的进度,我的代码调试通过,也可以显示进度,但是有个很大的问题,当前运行的系统好象死机了,同时该放置progressbar的窗体上的另外的label控件的值也无法显示,同死机的情况是一样的。请问怎么才能解决这个问题。我把代码贴出来。
//button事件
private void button1_Click(object sender, System.EventArgs e)
{
if (MessageBox.Show("确实要开始计算这个月的奖金吗?","询问",MessageBoxButtons.YesNo) == DialogResult.Yes)
{
try
{
int intRowNumber = this.dg_list.CurrentCell.RowNumber;//得到当前的行号
string js_year=this.dg_list[intRowNumber,0].ToString();//得到计算的年份
string js_month=this.dg_list[intRowNumber,1].ToString();//得到计算的月份
string bdate=this.dg_list[intRowNumber,2].ToString();//得到开始时间
string edate=this.dg_list[intRowNumber,3].ToString();//得到结束时间
copytable(js_year,js_month,edate);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
//////////////////
copytable方法
private void copytable(string year,string month,string cadate)
{
try
{
datalink dl=new datalink();
DataTable dt=dl.GetDataTable("select mb_name,mb_no,bank_no,bank_name,rec_no from mb_info");
//string count=dl.Readout("select count(*) from mb_info",0);
//int i=0;
progress pro=new progress();
pro.pb.Value=1;
pro.pb.Minimum=1;
pro.pb.Maximum=dt.Rows.Count;
foreach(DataRow myrow in dt.Rows)
{
string mb_no=myrow["mb_no"].ToString();
string mb_name=myrow["mb_name"].ToString();
string rec_no=myrow["rec_no"].ToString();
string bank_no=myrow["bank_no"].ToString();
string bank_name=myrow["bank_name"].ToString();
string sql="insert into award_month(memid,mb_name,bank_no,bank_name,rec_no,js_year,js_month,caldate)values('"+mb_no+"','"+mb_name+"','"+bank_no+"','"+bank_name+"','"+rec_no+"','"+year+"',"+month+",'"+cadate+"')";
dl.Operate_Data(sql);
pro.pb.PerformStep();//增加步长
}
pro.Close();
MessageBox.Show("奖金表初始化成功!");
}
catch(Exception ex)
{
throw ex;
}
}
今天在写程序的时候,需要用到progressbar。以便用来显示写入数据的进度,我的代码调试通过,也可以显示进度,但是有个很大的问题,当前运行的系统好象死机了,同时该放置progressbar的窗体上的另外的label控件的值也无法显示,同死机的情况是一样的。请问怎么才能解决这个问题。我把代码贴出来。
//button事件
private void button1_Click(object sender, System.EventArgs e)
{
if (MessageBox.Show("确实要开始计算这个月的奖金吗?","询问",MessageBoxButtons.YesNo) == DialogResult.Yes)
{
try
{
int intRowNumber = this.dg_list.CurrentCell.RowNumber;//得到当前的行号
string js_year=this.dg_list[intRowNumber,0].ToString();//得到计算的年份
string js_month=this.dg_list[intRowNumber,1].ToString();//得到计算的月份
string bdate=this.dg_list[intRowNumber,2].ToString();//得到开始时间
string edate=this.dg_list[intRowNumber,3].ToString();//得到结束时间
copytable(js_year,js_month,edate);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
//////////////////
copytable方法
private void copytable(string year,string month,string cadate)
{
try
{
datalink dl=new datalink();
DataTable dt=dl.GetDataTable("select mb_name,mb_no,bank_no,bank_name,rec_no from mb_info");
//string count=dl.Readout("select count(*) from mb_info",0);
//int i=0;
progress pro=new progress();
pro.pb.Value=1;
pro.pb.Minimum=1;
pro.pb.Maximum=dt.Rows.Count;
foreach(DataRow myrow in dt.Rows)
{
string mb_no=myrow["mb_no"].ToString();
string mb_name=myrow["mb_name"].ToString();
string rec_no=myrow["rec_no"].ToString();
string bank_no=myrow["bank_no"].ToString();
string bank_name=myrow["bank_name"].ToString();
string sql="insert into award_month(memid,mb_name,bank_no,bank_name,rec_no,js_year,js_month,caldate)values('"+mb_no+"','"+mb_name+"','"+bank_no+"','"+bank_name+"','"+rec_no+"','"+year+"',"+month+",'"+cadate+"')";
dl.Operate_Data(sql);
pro.pb.PerformStep();//增加步长
}
pro.Close();
MessageBox.Show("奖金表初始化成功!");
}
catch(Exception ex)
{
throw ex;
}
}
pro.pb.Value=1;
pro.pb.Minimum=1;
pro.pb.Maximum=dt.Rows.Count;
//在这里掉了以下代码
pro.Show();
其次,在线程中模式显示进度条窗体前者我就不多说了,开启简单的线程而已
后者参看
http://blog.csdn.net/knight94/archive/2006/05/27/757351.aspx
int i = 0;
private void button1_Click(object sender, EventArgs e)
{
Thread newThread = new Thread(new ThreadStart(Run));
newThread.Start();
} private void Run()
{
MethodInvoker mi = new MethodInvoker(UpdateProgress);
while (true)
{
Invoke(mi);
Thread.Sleep(10);
}
} private void UpdateProgress()
{
i++;
if (i % 100 == 0)
{
progressBar1.Increment(1);
}
button1.Text = i.ToString();
if (progressBar1.Value == 10)
{
button1.Enabled = true;
}
if (progressBar1.Value == 80)
{
Thread.CurrentThread.Abort();
this.Close();
}
}
用Thread
数据不多,直接就可以了
最好设置progress的Visibleprogress pro=new progress();
pro.pb.Value=1;
pro.pb.Minimum=1;
pro.pb.Maximum=dt.Rows.Count;
...
{
...
pro.pb.Value++
}
Application.DonEvents(); //解决CPU占用100%的问题