Как освободить объект Crystal Report при закрытии страницы asp.net

У меня есть приложение asp .net 3.5, использующее Crystal Reports для Visual Studio 2010.

У меня проблема с экраном предварительного просмотра отчета.

Если я не избавляюсь от объекта отчета на странице, то выгрузка объекта остается активной и никогда не исчезает, пока пул приложений сайта не будет переработан. Кроме того, временные файлы, созданные отчетом, не очищаются в этот момент.

Если я удаляю объект отчета в форме выгрузки, объект освобождается и временные файлы удаляются.

Но если я это сделаю, то объект отчета исчезнет, ​​и если пользователь выберет опцию экспорта отчета (из элемента управления просмотра на странице, которая все еще открыта), я получу ошибку:

not set to an instance of on object

На моей странице ReportViewer у меня просто есть элемент управления просмотра.

При загрузке страницы я создаю объект отчета и передаю его зрителю. Это все прекрасно работает.

Мой код утилизации это метод, который обрабатывает MyBase.Unload, сейчас моя проблема в том, что это событие вызывается, даже когда страница не закрывается, и я не могу найти событие, которое было бы похоже на событие закрытия в обычном окне.

Что мне нужно сделать, чтобы правильно утилизировать объект отчета, но только после того, как зритель фактически закроется?

3 ответа

      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);
        }

Почему бы не писать

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

в Page_Unload?

Это также очистит их, и вы можете использовать их до того времени, пока они не будут (экспортировать их и т. Д.). Это работает на моем конце.

Я наконец нашел ответ на этот вопрос, который работает должным образом.

Это может быть достигнуто только с помощью сценария и небольшого дополнительного кода

в.aspx файле средства просмотра отчетов мне нужно было добавить скрипт и вызов onunload

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

а также

<body onunload="cleanupCR()">

затем в файле.aspx.vb средств просмотра отчетов я изменил заднюю часть сообщения, чтобы отменить удаление объектов отчетов Crystal.

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 выдаст ошибку, а пока я просто помещаю туда пустую зацепку, чтобы учесть это. Мне нужно будет найти правильный способ проверить это значение, чтобы оно не выдавало ошибку.

Другие вопросы по тегам