我有一个Crystal报表,根据句点或特定客户端ID显示客户端数据。该报告由2个子报告组成,如果从Crystal Report(CR)运行,则根据正确CR对话框中接受的参数完美地工作。
从网页运行第一个报告页面在ReportViewer对象中正确显示。使用SQL事件探查器检查,使用正确的参数正确执行查询,为第一个子报告重新记录1条记录,为第二个子报告重新记录2条记录。 但是,单击报告以切换到下一页,将显示一条消息:“对象引用未设置为对象的实例。”
这里是ReportViewer的代码:
_crystalReportViewer.DisplayGroupTree = false;
_crystalReportViewer.HasCrystalLogo = false;
_crystalReportViewer.HasDrillUpButton = false;
_crystalReportViewer.HasToggleGroupTreeButton = false;
_crystalReportViewer.HasViewList = false;
_crystalReportViewer.ReportSource = _myReportDocument;
[...]
protected void Page_UnLoad (object sender, EventArgs e)
{
if (_crystalReportViewer != null)
_crystalReportViewer.Dispose();
_crystalReportViewer = null;
}
调试代码一切似乎都很好。我想问题可能出在ReportViewer或CR本身,但我找不到解决方法。你能给我任何建议吗? 提前谢谢!
答案 0 :(得分:0)
我知道问题出在Page_UnLoad事件中:每次单击Cristal Report中的下一个/上一个页面按钮时,都会调用它,处理Viewer并导致Object Reference异常。
我添加了一个条件来检查是否发生了PostBack:
protected void Page_UnLoad (object sender, EventArgs e)
{
if (!IsPostBack)
{
if (_crystalReportViewer != null)
_crystalReportViewer.Dispose();
_crystalReportViewer = null;
if (_myReportDocument != null)
{
_myReportDocument.Close();
_myReportDocument.Dispose();
}
_myReportDocument = null;
GC.Collect();
}
}
不幸的是,一个小问题仍然存在:在TEST机器上,一切正常但是一旦部署在DEV机器上(它们是2个不同的服务器,显然具有相同的设置),就可以只查看报告的前2条记录,然后通过点击CR Viewer的“下一步”按钮没有任何反应。来自CR的“Go TO”和“Print”等所有其他功能都可以正常工作。 这很奇怪,因为数据库设置是正确的,报告和代码是一样的......任何想法?