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