ReportViewer for WPF/Silverlight
サーバー内のファイルからドキュメントを読み込む
タスク別ヘルプ > 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);
  }
メモ:このトピックの内容は、ComponentOne for Silverlight にのみ適用されます。