问题:
今天在写程序的时候,需要用到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;
}
}

解决方案 »

  1.   

    progress pro=new progress();
    pro.pb.Value=1;
    pro.pb.Minimum=1;
    pro.pb.Maximum=dt.Rows.Count;
    //在这里掉了以下代码
    pro.Show();
      

  2.   

    我感觉应该放在多线程里作吧,或者用vs2005带的backgroundworker来实现
      

  3.   

    如果你需要真正做到一边导入数据,一边能显示进度,首先,把“copytable”用单独一个线程来完成
    其次,在线程中模式显示进度条窗体前者我就不多说了,开启简单的线程而已
    后者参看
    http://blog.csdn.net/knight94/archive/2006/05/27/757351.aspx
      

  4.   

    用多线程!
           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();
                }
            }
      

  5.   

    如果数据多
    用Thread
    数据不多,直接就可以了
    最好设置progress的Visibleprogress pro=new progress();
    pro.pb.Value=1;
    pro.pb.Minimum=1;
    pro.pb.Maximum=dt.Rows.Count;
    ...
    {
    ...
    pro.pb.Value++
    }
      

  6.   

    最简单的办法就是:pro.pb.PerformStep();//增加步长
    Application.DonEvents(); //解决CPU占用100%的问题