Существует много информации об использовании элемента управления ReportViewer в Silverlight для отображения нескольких отчетов, но я не могу заставить ни один из них работать на меня в моей ситуации, потому что способ, которым я все настроил, немного отличается , Мы должны были иметь возможность отправлять данные постов на страницу, на которой находится ReportViewer, поэтому пришлось добавить немного javascript для фактического открытия страницы.
Большая часть информации в Интернете говорит о простом добавлении строки ReportViewerCtrl.reset (), и она должна работать, но для меня это не имеет абсолютно никакого значения. Я уверен, что код лучше объяснит ситуацию, но если вам нужно больше подробностей о настройке, просто спросите.
Итак ... с самого начала ... кнопка гиперссылки для отчета вызывает это по клику: HtmlPage.Window.Invoke("showAspPage", par);
Это вызывает этот скрипт (я вырезал все, что обрабатывает параметры отчета и прочее, потому что он работает точно так же, когда эти данные все равно исключаются):
<script type="text/javascript">
var g_htmlWindow;
function showAspPage(param) {
var to = param["to"];
var myForm = document.createElement("form");
myForm.method = "post";
myForm.action = to;
myForm.setAttribute("target", "_blank");
//handle parameters here
document.body.appendChild(myForm);
myForm.submit();
document.body.removeChild(myForm);
}
</script>
param["to"]
- это ссылка на страницу, на которой находится фактический элемент управления ReportViewer
... из части aspx этой страницы:
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager>
<rsweb:ReportViewer ID="ReportViewer4" runat="server"> </rsweb:ReportViewer>
</form>
</body>
И важный фрагмент из части aspx.cs на странице ReportViewer
... (может быть слишком много для настройки свойств и т. Д., Но я добавил много вещей, пытаясь выяснить, какие предложения я нашел на сеть)
ReportViewer4.Reset();
ReportViewer4.ShowCredentialPrompts = false;
ReportViewer4.ServerReport.ReportServerCredentials = new ReportCredentials();
ReportViewer4.ProcessingMode = Microsoft.Reporting.WebForms.ProcessingMode.Remote;
ReportViewer4.ServerReport.ReportServerUrl = reportServerURL
ReportViewer4.AsyncRendering = false;
ReportViewer4.ServerReport.ReportPath = reportPath;
ReportViewer4.KeepSessionAlive = true;
ReportViewer4.ServerReport.SetParameters(params);
ReportViewer4.SizeToReportContent = true;
ReportViewer4.Width = Unit.Pixel(900);
ReportViewer4.ServerReport.Refresh();
Когда я хочу видеть только один отчет, все работает нормально - все настроено правильно. Но когда я хочу вызвать HtmlPage.Window.Invoke("showAspPage", par);
два раза подряд для двух разных отчетов, я начинаю получать эту ошибку либо при загрузке одного из отчетов, либо при попытке изменить параметры отчета в любом из двух отчетов: ASP Сеанс .NET истек или не может быть найден Оба отчета загружаются 95% времени - с параметрами, данными, всем; один отчет всегда загружается, но это зависит от того, какой из них завершает загрузку первым; но вы не можете изменить параметры без этой ошибки.
Так что ... в качестве небольшой альтернативы, в этой ситуации возможность изменить отчет на самом деле не нужна, и я мог бы сделать прямой экспорт в PDF, но с использованием сценариев вы не можете просто добавить "rs: Формат = PDF "до конца пути отчета. Однако, если параметры видны, они должны работать, если они изменены. Я думаю, я мог бы скрыть весь раздел параметров? Но это все еще не решает проблему получения ошибки, когда отчет иногда загружается ....
Также .... может быть совершенно не связано, но параметры зашифрованы, и мне нужно получить соль и хэш из базы данных (Entity Framework и WCF RIA Services), прежде чем я вызову HtmlPage.Window.Invoke .... Я нахожу этот вид странным .... но после загрузки экрана отчета, если пользователь сидит там и ничего не нажимает (но не сидит там достаточно долго, чтобы фактически выйти из системы, может быть, всего 5 минут или итак) я получаю эту ошибку:
'Операция загрузки не выполнена для запроса' GetStuff '. Удаленный сервер возвратил ошибку: Not Found. ', но опять же, он работает нормально, если щелкнуть сразу. У меня никогда не было такого, пока я не начал эти два отчета одновременно.
Пожалуйста ... любые советы .... или предложения ... или альтернативы ... или ссылки ...
Спасибо.
Итак ... Я пытался скрыть весь раздел параметров, но пользователю все еще нужно иметь возможность печатать и экспортировать. Он отлично работает для одного из отчетов, но в другом я получаю это для всего окна (при экспорте в PDF для обоих отчетов):
[AspNetSessionExpiredException: ASP.NET session has expired or could not be found]
Microsoft.Reporting.WebForms.ViewerDataOperation..ctor() +330
Microsoft.Reporting.WebForms.ReportDataOperation..ctor(Boolean requiresFullReportLoad) +120
Microsoft.Reporting.WebForms.ReportDataOperation..ctor() +33
Microsoft.Reporting.WebForms.ExportOperation..ctor() +29
Microsoft.Reporting.WebForms.HttpHandler.GetHandler(String operationType) +188
Microsoft.Reporting.WebForms.HttpHandler.ProcessRequest(HttpContext context) +111
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +100
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75