长 运行 查询的进度条

Progress Bar For Long Running Query


我在 C# 中使用 VS 2005。我有一个大约需要 25 到 30 秒的查询,并使用 crystal 报告显示结果。
我想在执行查询时显示进度条。
我的情况与 Progress bar for long running task in C#
相同 我按照 post 中的步骤操作,但进度条是空白的。
请查看我的代码并告知需要什么。

private string orderby, startDate, endDate, brandName;
ReportDocument rpt;
private BackgroundWorker bgw;
private void SearchFunction()
 {            
        orderby = cboOrderBy.Text;
        startDate = txtFromDate.Text;
        endDate = txtToDate.Text;
        brandName = txtBrandName.Text;
        bgw = new BackgroundWorker();
        bgw.WorkerReportsProgress = true;
        bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged);
        bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted);
        bgw.DoWork += new DoWorkEventHandler(bgw_DoWork);
        bgw.RunWorkerAsync();
}

void bgw_DoWork(object sender, DoWorkEventArgs e)
{
            dt = obj1.getData1(orderby, startDate, endDate, brandName);          
}

void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
            progressBar1.Value = e.ProgressPercentage;
 }

 void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
 {
            //After completing the job.
            MessageBox.Show(@"Finished");
            if (dt.Rows.Count > 0)
            {
                //some code for crystal report like
                rpt = new myReport();                
                rpt.SetDataSource(dt);
                crystalReportViewer1.ReportSource = rpt;
                crystalReportViewer1.Refresh();
            }
            else
            {
                MessageBox.Show("No record found !");
            }
 }

简单,

你实际上并没有报告任何进展。

参见:https://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.reportprogress(v=vs.110).aspx

方法 1:显示进度(0% 到 100%)

只需在DoWork方法中调用ReportProgress即可。

void bgw_DoWork(object sender, DoWorkEventArgs e)
{
   int percentComplete = 0;
   // Do work and let the work increment percepercentComplete as it's busy.
   bgw.ReportProgress(percentComplete);
}

这意味着您必须更改 getData1 方法需要在繁忙时分块报告进度。

方法二:无进度百分比(只是表示很忙)

如果您不想更改 getData1,请在您的 ProgressBar.

上将 IsInderminate 属性 设置为 true
progressBar1.IsInderminate = true;

那么你根本不需要bgw_ProgressChanged方法。 DoWorkRunWorkerCompleted 就足够了。

编辑:

抱歉,我使用的是 WPF。 For.NET 2 您使用的是 WinForms 吗?

WinForms: 在设计器中,在 ProgressBar 上,将 Style 更改为 Marquee