【问题标题】:Progress Bar For Long Running Query长时间运行查询的进度条
【发布时间】:2015-09-04 19:22:37
【问题描述】:


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

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 !");
            }
 }

【问题讨论】:

  • 在 DoWork 方法中将数据分配给数据表后添加 ReportProgress 不会提供所需的输出。由于查询执行时间过长,进度条在很长一段时间后开始填充。
  • 期望的输出是什么?更新进度是你的责任,因为你只是调用一个函数,你唯一的选择是@Niels Filter Method 2

标签: c# crystal-reports progress-bar


【解决方案1】:

方法 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 方法需要在忙碌时分块报告进度。

方法2:无进度百分比(仅显示它很忙)

如果您不想更改 getData1,请将您的 ProgressBar 上的 IsInderminate 属性设置为 true。

progressBar1.IsInderminate = true;

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

编辑:

抱歉,我假设是 WPF。对于 .NET 2,您使用的是 WinForms?

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

【讨论】:

  • 感谢您的回答。但是我找不到 IsInderminate 属性,是因为我使用的是 .Net framework 2 吗?我如何编辑 getData1 方法,因为它只是一个 sql 语句并使用 dataAdapter.fill 方法,不包括任何循环或许多过程。
  • 抱歉,我假设是 WPF。现在假设 WinForms (.NET 2)?查看更新的答案:在设计器中,将 ProgressBar Style 更改为 Marquee
  • 您好 Niels Filter,非常感谢您的帮助。我现在将进度条样式更改为 Marquee。我仍然想知道如何在不循环的情况下使用 ReportProgress。我在网上找到的只是使用循环,我的函数没有循环,但只有一个查询,并使用数据适配器将结果填充到数据表中。请建议。
  • 如果您想在不循环的情况下调用ReportProgress,另一种选择是将getData1 拆分为多个部分或查询,然后在每次查询后调用ReportProgress
【解决方案2】:

【讨论】:

  • 同意。 OP 我想需要从内部调用这个 getData()
  • @MickyDuncan 确实,希望正确的用法是 OP 的练习。我确实希望人们在这里问“为我做”问题之前先阅读教程。可悲的是,如今你如何成为公认的答案。
  • 我听到了,伙计。所以政策是你可以给他们足够的东西让他们走上他们的路。 :) “任何让提问者朝着正确方向前进的答案都是有帮助的”。无论如何+1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多