タスク別ヘルプ > C1ReportViewer へのドキュメントの読み込み > サーバー内のファイルからドキュメントを読み込む |
C1ReportViewer コントロールを使用するシナリオとしてよくあるのは、スケジュールに基づいてレポートサーバー(C1Report や Microsoft SQL Server Reporting Services など)でレポートを生成し、生成したレポートをサーバーのファイルシステムに配置する場合です。次に、Silverlight アプリケーションで、サーバーからこれらのファイルを取得し、ほとんどオーバーヘッドなくユーザーに表示できます。
C1ReportViewer をアプリケーションに追加した後で、Silverlight 対応 WCF サービスをサーバープロジェクトに追加する必要があります。このサービスは、存在するレポートのリストと、各レポートの実際のドキュメントストリームを Silverlight クライアントに提供します。
たとえば、次のコードは、レポートプロバイダ Web サービスの典型的な実装です。
コードのコピー
|
|
---|---|
<ServiceContract([Namespace] := "")> _ <AspNetCompatibilityRequirements(RequirementsMode := AspNetCompatibilityRequirementsMode.Allowed)> _ Public Class ReportingService <OperationContract> _ Public Function GetReportList() As String() Dim path__1 = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "Resources") Return Directory.GetFiles(path__1, "*.pdf") End Function <OperationContract> Public Function GetReportStream(reportName As String) As Byte() ' ファイル名を取得します Dim path__1 = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "Resources") reportName = Path.Combine(path__1, reportName) ' ファイルをストリームに読み込みます Dim ms = New MemoryStream() Dim buff = New Byte(63999) {} Using sr = New FileStream(reportName, FileMode.Open) While True Dim read As Integer = sr.Read(buff, 0, buff.Length) ms.Write(buff, 0, read) If read = 0 Then Exit While End If End While End Using End Function ' バイトストリームを返します Return ms.ToArray() End Class |
コードのコピー
|
|
---|---|
[ServiceContract(Namespace = "")] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class ReportingService { [OperationContract] public string[] GetReportList() { var path = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "Resources"); return Directory.GetFiles(path, "*.pdf"); } [OperationContract] public byte[] GetReportStream(string reportName) { // ファイル名を取得します var path = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, "Resources"); reportName = Path.Combine(path, reportName); // ファイルをストリームに読み込みます var ms = new MemoryStream(); var buff =new byte[64000]; using (var sr = new FileStream(reportName, FileMode.Open)) { for (; ; ) { int read = sr.Read(buff, 0, buff.Length); ms.Write(buff, 0, read); if (read == 0) break; } } } // バイトストリームを返します return ms.ToArray(); } } |
このように、コードはたいへん標準的です。最初のメソッドはサーバーにあるレポートをリストし、Silverlight アプリケーションはユーザーにレポートのリストを表示します。2番目のメソッドは、選択されたレポートを表すバイトストリームを返します。
アプリケーションのクライアント部分は、次のようにサービスを使用します。
コードのコピー
|
|
---|---|
Public Sub New() InitializeComponent() ' 存在するレポートのリストを取得します Dim svc = New ReportingServiceReference.ReportingServiceClient() AddHandler svc.GetReportListCompleted, AddressOf svc_GetReportListCompleted svc.GetReportListAsync() End Sub ' サーバーにあるレポートのリストを ComboBox に設定します Private Sub svc_GetReportListCompleted(sender As Object, e As ReportingServiceReference.GetReportListCompletedEventArgs) _cmbReport.Items.Clear() For Each file As String In e.Result _cmbReport.Items.Add(Path.GetFileNameWithoutExtension(file)) Next _cmbReport.IsEnabled = True _cmbReport.SelectedIndex = 0 End Sub ' 選択されたレポートを表示します Private Sub ReportType_Click(sender As Object, e As EventArgs) ' レポート名を作成します Dim reportName As String = DirectCast(_cmbReport.SelectedItem, String) reportName += If(_btnPDF.IsChecked.Value, ".pdf", ".mhtml") ' ストリームを取得します Dim svc = New ReportingServiceReference.ReportingServiceClient() AddHandler svc.GetReportStreamCompleted, AddressOf svc_GetReportStreamCompleted svc.GetReportStreamAsync(reportName) End Sub ' レポートを表示します Private Sub svc_GetReportStreamCompleted(sender As Object, e As ReportingServiceReference.GetReportStreamCompletedEventArgs) Dim ms = New MemoryStream(e.Result) _reportViewer.LoadDocument(ms) End Sub |
コードのコピー
|
|
---|---|
public MainPage() { InitializeComponent(); // 存在するレポートのリストを取得します var svc = new ReportingServiceReference.ReportingServiceClient(); svc.GetReportListCompleted += svc_GetReportListCompleted; svc.GetReportListAsync(); } // サーバーにあるレポートのリストを ComboBox に設定します void svc_GetReportListCompleted(object sender, ReportingServiceReference.GetReportListCompletedEventArgs e) { _cmbReport.Items.Clear(); foreach (string file in e.Result) { _cmbReport.Items.Add(Path.GetFileNameWithoutExtension(file)); } _cmbReport.IsEnabled = true; _cmbReport.SelectedIndex = 0; } // 選択されたレポートを表示します void ReportType_Click(object sender, EventArgs e) { // レポート名を作成します string reportName = (string)_cmbReport.SelectedItem; reportName += _btnPDF.IsChecked.Value ? ".pdf" : ".mhtml"; // ストリームを取得します var svc = new ReportingServiceReference.ReportingServiceClient(); svc.GetReportStreamCompleted += svc_GetReportStreamCompleted; svc.GetReportStreamAsync(reportName); } // レポートを表示します void svc_GetReportStreamCompleted(object sender, ReportingServiceReference.GetReportStreamCompletedEventArgs e) { var ms = new MemoryStream(e.Result); _reportViewer.LoadDocument(ms); } |