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

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

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

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

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

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

not set to an instance of on object

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

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

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

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


person CHJ124    schedule 18.10.2013    source источник
comment
спасибо за правку, dcaswell, стало намного лучше   -  person CHJ124    schedule 19.10.2013


Ответы (2)


Наконец-то я нашел ответ на этот вопрос, который работает правильно.

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

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

person CHJ124    schedule 22.10.2013

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

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

в Page_Unload?

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

person JulyOrdinary    schedule 06.11.2013