ピースペース

Silverlightの印刷レポートについて再度考え直してみる

leave a comment »

Microsoft Reportのfor SilverlightなReportViewerがない!
が問題。と思っていた。けど、
よくよく考えてみると、
Silverlightをホストしているサイトがあって、
そこにはデータを提供しているDomainServiceもある。てことは、
単に、ReportViewerを配置したWebFormページをSilverlightから開けば良いだけ。
に、やっと気づいた。←遅いっ;; てか、頭固い→自分

レポートの作成は
http://codezine.jp/article/detail/5910
を使う。ちょっと慣れないけど、使えないことはない。

Silverlightから要求するページ(aspx)には、
ReportViewerとObjectDataSourceを配置して、
ObjectDataSourceはSilverlight用に準備したDomainServiceのメソッドを参照するようにする。
これで、ReportViwerはうまく表示できるようになる。
が、ReportViwerがなんだかぼろくて、実際の印刷イメージともちょっと違う感じで表示される。

ここは、上の記事にもあるように、ユーザーにはViewerページを表示するのではなく、
PDFを直接出力した方が親切。
てことで、解説にならって、
ReportViewer1.LocalReport.Renderで応答を書き換えるコードを追加してみる…
「ローカル レポートの処理中にエラーが発生しました。」で失敗する。
エラー内容がそれだけで、何が問題か?がわからない(T.T)

ReportViewer1.LocalReport.RenderをPage_Loadで実行するようにした。
その時点で、デザイナで配置した、
ReportViewerもObjectDataSourceもインスタンスが存在している。
が、ReportViewer1.LocalReportが必要とするReportDataSourceのインスタンスがまだない。
が、どうも原因らしい。これはちょっとわかりにくい;;;

ということで、次のようなコードで無事PDF出力ができました。
DomainServiceメソッドのパラメタは、要求のクエリ文字からとりだして
ObjectDataSource1_Selectingでセットします。

protected void Page_Load(object sender, EventArgs e)
{
    // ReportViewerの代わりにPDFで出力する

    ReportDataSource rds = new ReportDataSource("DataSet1", ObjectDataSource1);
    ReportViewer1.LocalReport.DataSources.Clear();
    ReportViewer1.LocalReport.DataSources.Add(rds);

    Warning[] warnings;
    string[] streamIds;
    string mimeType = string.Empty;
    string encoding = string.Empty;
    string extension = string.Empty;

    byte[] bytes = ReportViewer1.LocalReport.Render(
        "PDF",
        null,
        out mimeType,
        out encoding,
        out extension,
        out streamIds,
        out warnings
        );

    Response.Buffer = true;
    Response.Clear();
    Response.ContentType = mimeType;
    Response.AddHeader("content-disposition", "attachment; filename=patientlist" + "." + extension);
    Response.BinaryWrite(bytes);
    Response.End();
}

Written by nasu38yen

2012年8月21日 @ 12:28 PM

カテゴリー: .NET, プログラム

Tagged with

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。