1

我有一个使用 Crystal Reports for Visual Studio 2010 的 asp .net 3.5 应用程序。

我的报告预览屏幕有问题。

如果我不在页面卸载中处理报表对象,则该对象将保持活动状态并且永远不会消失,直到站点的应用程序池被回收。此外,报告创建的临时文件此时不会被清理。

如果我在卸载表单中处理报表对象,则会释放该对象并删除临时文件。

但是如果我这样做了,那么报表对象就消失了,如果用户选择导出报表的选项(从仍然打开的页面上的查看器控件),我会收到错误消息:

not set to an instance of on object

在我的 ReportViewer 页面中,我只有查看器控件。

在页面加载中,我创建了报告对象并将其传递给查看器。这一切都很好。

我的处理代码是一个处理方法,MyBase.Unload现在我的问题是即使页面没有关闭,这个事件也会被触发,我找不到像普通窗口上的关闭事件一样的事件。

我需要做什么才能正确处理报告对象,但直到查看器实际关闭之后?

4

3 回答 3

0
      private bool disposed = false;

        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposed)
            {
                if (disposing)
                {
                    context.Dispose(); //context means your crystal report document object.
                }
            }
            this.disposed = true;
        }

        public void Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }
于 2014-10-14T07:32:18.903 回答
0

我终于找到了一个可以正常工作的问题的答案。

这只能通过使用脚本和一些额外的代码来完成

在报表查看器的 .aspx 文件中,我必须添加一个脚本和一个 onunload 调用

<script language="javascript" type="text/javascript" >
    function cleanupCR() {
        __doPostBack('', 'DisposeOfCR');
        }
</script>

<body onunload="cleanupCR()">

然后在报告查看器 .aspx.vb 文件中,我修改了我的回帖捕获以处理水晶报告对象的处理

If Me.IsPostBack Then
    rpt = Session(Me.HIDDENRPTKEY.Value)
    CrystalReportViewer1.ReportSource = rpt
    If (Me.Request.Params("__EVENTARGUMENT") = "DisposeOfCR") Then
        DisposeOfReportObject()
    End If
    Return
End If

最后,我添加了处理报告对象的方法:

If rpt IsNot Nothing Then
    Try
        If rpt.Database IsNot Nothing Then
            rpt.Database.Dispose()
        End If
    Catch
    End Try
    rpt.Close()
    rpt.Dispose()
End If

如果报告数据库对象无效,rpt.Database 测试将引发错误,现在我只是将空捕获放在那里以允许这样做。我将不得不找到测试该值的正确方法,这样它就不会引发错误。

于 2013-10-22T15:52:06.077 回答
0

为什么不写

Report.Close();
Report.Dispose();

在 Page_Unload?

这也将清除它们,您可以使用它们直到它们存在(导出它们等)。它在我的最后工作。

于 2013-11-06T13:20:05.107 回答