我有一个带有Crystal Report Viewer Control的Asp.net表单。
在Page_Load事件中,我正在加载报告&从数据库设置数据源。
id
这是相关的html
compareable
我设置了 EnableDatabaseLogonPrompt =“false”,因为我提供了自己的数据源&登录问题不会出现。
当我的数据加载页面时,我会看到报告。 但是,当我选择“转到下一页”水晶报表查看器控件的链接时,会弹出错误
错误:“数据库登录失败。”
似乎我错过了一些东西(可能重新绑定数据集/报告),但无法弄明白......
我可以通过注释掉Line if(!IsPostBack)来解决这个错误。 但这是再次查询数据库的正确方法吗?每次用户更改页面时加载整个报告?
或者是否有更简单/更容易的选择..
答案 0 :(得分:0)
加载报告的代码必须在每次回发时执行。 Page_Init是您可以放置此代码的正确位置(Page_Load可能会导致一些错误)。
嘿,建议在每个页面卸载时关闭ReportDocument;这样可以避免在报告计数器上无法控制地增加停止应用程序
protected void Page_Unload(object sender, EventArgs e)
{
if (reportDocument != null)
reportDocument.Close();
}
答案 1 :(得分:0)
将代码放在LoadData方法中,该方法应调用if(!IsPostBack)。 IsPostBack用于Ajax调用,而CrystalReports则不然。
我是这样做的:
<CR:CrystalReportSource ID="CrystalReportSource1" runat="server">
<Report FileName="myCristalReport.rpt"></Report>
</CR:CrystalReportSource>
<CR:CrystalReportViewer
ID="CrystalReportViewer1"
runat="server"
AutoDataBind="true"
EnableDatabaseLogonPrompt="False"
EnableParameterPrompt="False"
ReportSourceID="CrystalReportSource1"
ToolPanelView="None" />
并在LoadData中:
var reportSource = (CrystalReportSource)this.FindControlRecursively("CrystalReportSource1");
reportSource.ReportDocument.SetDatabaseLogon("dbuser", "dbpassword");
reportSource.ReportDocument.SetParameterValue("Month", 2);
...