尝试导航到网页中Crystal Report的下一页时出现“对象引用异常”

时间:2011-06-28 10:26:10

标签: crystal-reports

我有一个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本身,但我找不到解决方法。你能给我任何建议吗? 提前谢谢!

1 个答案:

答案 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”等所有其他功能都可以正常工作。 这很奇怪,因为数据库设置是正确的,报告和代码是一样的......任何想法?