【问题标题】:how to show the progress bar while loading the crystal report加载水晶报表时如何显示进度条
【发布时间】:2014-05-12 07:54:06
【问题描述】:

我正在开发 Windows 窗体应用程序...我有一个水晶报告...用于在按钮单击事件中显示水晶报告我给出的代码如下:

SqlCommand cmdrslt = new SqlCommand("rptdeptwisevisitor", con.connect);
cmdrslt.CommandType = CommandType.StoredProcedure;
cmdrslt.Parameters.Add("@startDate", SqlDbType.NVarChar, 50, ParameterDirection.Input).Value = frmdateval;
cmdrslt.Parameters.Add("@endDate", SqlDbType.NVarChar, 50, ParameterDirection.Input).Value = Todateval;
SqlParameter tvp1 = cmdrslt.Parameters.AddWithValue("@Dept", DepTable);
tvp1.SqlDbType = SqlDbType.Structured;
tvp1.TypeName = "dbo.Dept";
da.SelectCommand = cmdrslt;
da.Fill(ds);
DeptWiseRpt rpt = new DeptWiseRpt();
if ((ds.Tables(0).Rows.Count > 0)) {
    rpt.SetDataSource(ds.Tables(0));
    rpt.SetParameterValue("frmd", setparmstartd);
    rpt.SetParameterValue("tod", setparmendd);
    CrystalReportViewer1.ReportSource = rpt;

}

这需要时间来加载数据..所以我想在这个表单上放一个进度条..我该怎么放呢?
任何帮助都是非常可观的......

【问题讨论】:

  • 您可以为此使用后台工作程序。有关详细信息,请参阅this 问题。
  • 但我想在加载记录时显示进度条..
  • 把所有耗时的代码都放到BackgroundWorker.DoWork方法中(也可以使用Tasks)。
  • 先生,您能举个例子吗?
  • 使用搜索“c# backgroundworker progressbar site:stackoverflow.com”为您提供以下结果:123

标签: c# winforms crystal-reports


【解决方案1】:

加载报告是一个操作(最多两个:查询和显示查看器),因此您无法将其拆分为准确显示进度。您可以显示 progressless 条或使用像这样的动画图像:

该操作必须与 UI 线程并行运行(使用 Thread、Task 或 BackgroundWorker),否则您的进度(进度条或图像)甚至不会更新一次。在加载时,您不应显示报表查看器本身(使其不可见或大小为 1x1)。加载完成后:隐藏进度并显示查看器。

一些代码:

// hide viewer, show progress
CrystalReportViewer1.Visible = false;
pictureBoxProgress.Visible = true;
// start thread
(new Thread(() => {

    // your code
    SqlCommand cmdrslt = new SqlCommand("rptdeptwisevisitor", con.connect);
    cmdrslt.CommandType = CommandType.StoredProcedure;
    cmdrslt.Parameters.Add("@startDate", SqlDbType.NVarChar, 50, ParameterDirection.Input).Value = frmdateval;
    cmdrslt.Parameters.Add("@endDate", SqlDbType.NVarChar, 50, ParameterDirection.Input).Value = Todateval;
    SqlParameter tvp1 = cmdrslt.Parameters.AddWithValue("@Dept", DepTable);
    tvp1.SqlDbType = SqlDbType.Structured;
    tvp1.TypeName = "dbo.Dept";
    da.SelectCommand = cmdrslt;
    da.Fill(ds);
    DeptWiseRpt rpt = new DeptWiseRpt();
    if ((ds.Tables(0).Rows.Count > 0)) {
        rpt.SetDataSource(ds.Tables(0));
        rpt.SetParameterValue("frmd", setparmstartd);
        rpt.SetParameterValue("tod", setparmendd);
        // controls operations require invoke
        BeginInvoke(() => {
            CrystalReportViewer1.ReportSource = rpt;
            pictureBoxProgress.Visible = false;
            CrystalReportViewer1.Visible = true;
        });
    }
})).Start();

【讨论】:

  • 我怎样才能给你的动画图像以及我必须对代码进行哪些更改?
  • 不是我的图片。自己制作、购买或寻找免费的。使用PictureBox 在winforms 中显示。代码见编辑。
  • 我已经解释了使用Thread 的必要性:在准备数据(查询、设置DeptWiseRpt)时不要阻塞UI 线程。如果设置ReportSource 本身是一个瓶颈,我不确定如何处理,也许水晶报告有一些选项来preload(预渲染数据)。在这里我帮不了你。关于动画图片,搜索“gif”,有很多 gif 编辑器或转换器(从 avi 到示例)。或者在 internet 中找到一个。
  • 如果我下载 jpg 图像..我必须转换成哪种格式..得到像你的图像(动画)
  • Gif。你需要多个 jpg 来制作单个 gif。也许您应该尝试将 gif 下载为 gif?
猜你喜欢
  • 1970-01-01
  • 2014-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-11
  • 1970-01-01
相关资源
最近更新 更多