ReportViewer Webコントロール 小ネタ

またまた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指定もできません。

f:id:ihisa:20150219183815p:plain f:id:ihisa:20150219183825p:plain

だので、描写完了後に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