我正在尝试使用动态数据源创建Crystal Report。当我单击报告按钮时,水晶报告显示正常,但是当我单击任何按钮时,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();
}
}
非常感谢任何帮助。谢谢你提前。
答案 0 :(得分:1)
所以,我无法通过其他方式实现这一点,但我确实让它以不同的方式开展工作。首先,我将一个CrystalReportSource控件添加到aspx页面,
<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();
}
答案 1 :(得分:1)
我刚刚使用CrystalReportViewer解决了这个问题导航事件
在查看报告按钮中我已在会话中保存报告文档
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的Navigate事件中,我将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数据源都将设置为会话中保存的报表文档。