1

我正在尝试使用动态数据源创建 Crystal Report。当我单击报表按钮时,水晶报表显示得很好,但是当我单击水晶报表工具栏上的任何按钮(即下一页、导出到等)时,我会弹出错误消息“没有有效的报表源可用。”

这是我的 C# 代码的样子:

private void GenerateReport()
{
    using (DataContext reports = new DataContext())
    {
        var results = //Linq Query;

        ReportDocument pr = new ReportDocument();
        pr.Load(Server.MapPath(@"CrystalReport1.rpt"));
        pr.SetDataSource(results.ToList());

        CrystalReportViewer1.ReportSource = pr;
        CrystalReportViewer1.DataBind();
    }
}

任何帮助将不胜感激。提前致谢。

4

2 回答 2

1

所以,我不能用另一种方式让它工作,但我确实让它以不同的方式工作。首先,我在 aspx 页面中添加了一个 CrystalReportSource 控件,

<CR:CrystalReportSource ID="CrystalReportSource1" runat="server">
   <Report FileName="CrystalReport1.rpt">
  </Report>
</CR:CrystalReportSource>

然后在文件后面的代码中,我没有将数据源直接设置为 CrystalReportViewer1,而是将其设置为 CrystalReportSource,然后将其设置为 CrystalReportViewer1 的报表源。现在一切正常!

using (DataContext reports = new DataContext())
{
    var results = //Linq Query;
    CrystalReportSource1.ReportDocument.SetDataSource(results.AsEnumerable());

    CrystalReportViewer1.ReportSourceID = "CrystalReportSource1";
    CrystalReportViewer1.RefreshReport();
}
于 2012-07-09T14:41:33.600 回答
1

我刚刚使用 CrystalReportViewer Navigate Event解决了这个问题

在查看报告按钮中,我已在会话中保存报告文档

  Protected Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
   ' -- the ds is dataset variable containing data to be displayed in the report

    rptDoc.SetDataSource(ds)
    Session.Add("rptdoc", rptDoc)
    CrystalReportViewer1.ReportSource = rptDoc

    End Sub  

然后在 CrystalReportViewer 的导航事件中,我将 CrystalReportViewer 数据源设置为 Session

Protected Sub j(ByVal source As Object, ByVal e As CrystalDecisions.Web.NavigateEventArgs) Handles CrystalReportViewer1.Navigate

    rpt.SetDataSource(ds)
    CrystalReportViewer1.ReportSource = session("rptdoc")

End Sub

因此,每次导航到报表中的另一个页面之前,CrystalReportViewer 数据源都会设置为会话中保存的报表文档。

于 2016-07-22T12:31:49.603 回答