またまたReportViewer Webコントロールです。
本コントロールはレポート表示にとっても便利なのですが、日本ではあまり認識されていないのか記事があまりありません。
目指せ認知度アップ!今回は小ネタ集です。
レポート表示時に以下の例外が発生した場合の対応
System.Web.HttpException (0x80004005): The URL-encoded form data is not valid. ---> System.InvalidOperationException: Operation is not valid due to the current state of the object.
対象レポートのコントロールおよびコントロールの要素(例えばドロップダウンリストのoption)が多すぎる事が原因です。
Web.configのappSettingsに以下追加することで回避できます。
多くのフォーム キー、ファイル、または JSON ペイロード メンバーを含む ASP.NET 要求が例外が発生して失敗する
http://support.microsoft.com/kb/2661403/ja
<add key="aspnet:MaxHttpCollectionKeys" value="10000" />
SSRSの例外を検知する
サーバーレポートの処理ではMicrosoft.Reporting.WebForms.ReportServerException例外をthrowするので、これをcatchすれば良いです。
Rende処理時にtry-catchします。以下参照。
try { // レポート取得 bytes = this.ReportViewerShow.ServerReport.Render(format, deviceInfo, out mimeType, out encoding, out extension, out streamids, out warnings); } catch (Microsoft.Reporting.WebForms.ReportServerException) { // こんなんしたら画面通知できます。 ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alert", "alert('エラーでっせ!');", true); return; }
ReportViewerのメニューからダウンロードをする場合はGlobal.asaxのApplication_Errorでcatchします。
void Application_Error(object sender, EventArgs e) { Exception exception = Server.GetLastError(); if (exception.GetType() == typeof(Microsoft.Reporting.WebForms.ReportServerException)) { // なんか処理 } }
余談
古いSSRS(2008 RS)だとExcelのダウンロード形式が[xls]のため、列の制約が256列になります。
列数をオーバーしたレポートを処理しようとして上記例外が発生した場合、Messageに[256]の文字列が存在するか確認する必要があります。
ReportViewer Webコントロール内Htmlタグへのスタイル指定
SSRSで作成するレポートが出力するHtmlはスタイル指定がstyle属性にベタ書きで出力されます。class指定もできません。
だので、描写完了後にid指定でスタイルを上書きします。全てできるわけではありませんが一部は可能です。
非同期ポストバック完了後のイベントをWebフォーム内に定義します。
<script type="text/javascript" language="javascript"> $(function () { Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function () { // 対象idのスタイルを破棄する $('#ctl00_MainContent_ReportViewerShow_ctl04_ctl00').removeAttr('style'); // 対象idに定義済みスタイルを適用する $('#ctl00_MainContent_ReportViewerShow_ctl04_ctl00').addClass('btn btn-success'); }); }); </script>
尚、ReportViewer WebコントロールはWCFのビューページ(cshtml)では使えないため、 SSRSをASP.NETから使う際はWebフォーム(aspx)を用いる必要があります。
Sys.WebForms.PageRequestManager の endRequest イベント https://msdn.microsoft.com/ja-jp/library/bb383810%28v=vs.100%29.aspx