从execl导入数据到数据库,
在主窗体中,用backgroundworker实现了,
但想在点确认按钮后,在新窗体中显示进度条,请教了,谢谢

解决方案 »

  1.   

    backgroundworker 
    有1个属性:WorkerReportProgress设置成true
    另外两个事件:
    DoWork:你用这个事件来做从excel导入到数据库中的工作
    在调用RunWorkerAsync()方法之前,计算你需要导入到 数据库中的excel总行数.
    然后在 DoWork 事件处理过程中:
    每处理一定数据你报告一下当前进度 用成员函数 ReportProgress(进度值);这个进度值你可以根据你的总体数据量 具体设定
    ProgressChanged:事件就会触发
    private void bkWork_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        int progress = e.ProgressPercentage;
        //这个时候就用progress 来设定你 新窗口的进度条
    }
      

  2.   

    ReportProgress(进度值)后 你Sleep(10)毫秒呢?
      

  3.   

    private void bworkerExecl_DoWork(object sender, DoWorkEventArgs e)
            {
                try
                {
                    e.Result = this.RetrieveData(bworkerExecl, e);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    throw;
                }
            }        private int RetrieveData(BackgroundWorker worker, DoWorkEventArgs e)
            {
                int maxRecords = (int)e.Argument;
                int percent = 0;
                for (int i = 0; i < maxRecords; i++)
                {
                    if (worker.CancellationPending)
                    {
                        return i;
                    }                //添加到数据库
                    Mcontact.groupid = Xgroupid;
                    Mcontact.name = DTexecl.Rows[i][Xname].ToString();
                    Mcontact.phone = DTexecl.Rows[i][Xphone].ToString();
                    Mcontact.gender = DTexecl.Rows[i][Xgender].ToString();
                    Mcontact.profession = "";
                    Mcontact.position = DTexecl.Rows[i][Xposition].ToString();
                    Mcontact.zipcode = DTexecl.Rows[i][Xzip].ToString();
                    Mcontact.address = DTexecl.Rows[i][Xaddress].ToString();
                    Mcontact.company = DTexecl.Rows[i][Xcompany].ToString();
                    Bcontact.Add(Mcontact);                percent = (int)(((double)i / (double)maxRecords) * execlcount);
                    worker.ReportProgress(percent, new KeyValuePair<int, string>(i, Guid.NewGuid().ToString()));
                    if (i % 1000 == 0 || i == maxRecords-1)
                    {
                        Thread.Sleep(100);
                    }
                }            return maxRecords;
            }
    该有的功能都有,应该不是这个地方的问题。我问题中已经说过,我在同窗体中实现了进度条的功能。
      

  4.   

    或者你 不用backgroundworker  呢?自己写异步调用在异步回调中进行进度条的更新。 不过需要注意 跨线程间控件的调用。