none
MicrosoftReportViewerプレビュー後、定義ファイル(rdlc)を変更して再プレビューする方法 RRS feed

  • 質問

  • 開発環境:VisualStudio2008,C#(質問自体は言語に依存しないと思います)
    MicrosoftReportViewerでプレビュー後、ボタンクリックでクライアントレポート定義(.rdlc)を
    変更して再プレビューする方法を探しています。
    操作画面がすっきりするので、Panel区切りのフォームを考えています。
    自動作成されたコード(InitializeComponentの部分)をコピーして、クリックイベントに貼り付
    けて編集(ReportEmbeddedResourceを変更)しましたが、希望通りの動きをしません(プレ
    ビュー画面に変化なし)。
    .rdlcファイルは、テキストボックスだけの単純なものです。

    <Form1の構成>
    1.Form1にPanelを配置
    2.Panel1にButton1とButton2を配置
    3.クライアントレポート定義(.rdlc)としてA.rdlcとB.rdlcを作成
    4.Panel2にMicrosoftReportViewerを配置
    5.[ReportViewerタスク]-[レポートの選択]で、A.rdlcを選択
    6.デバッグするとA.rdlcのプレビューが表示される

    <希望する動作>
    Panel1のButton2クリックで、Panel2のプレビュー画面をB.rdlcにする。

    デバッグ時にエラーがでないので、根本的に間違っている気がしますが、この件に関する
    ReportViewerの解説を見つける事が出来ませんでした。
    参考になる情報がありましたら、宜しくお願いします。
    private void button2_Click(object sender, EventArgs e)
    {
      this.splitContainer1 = new System.Windows.Forms.SplitContainer();
      this.button2 = new System.Windows.Forms.Button();
      this.button1 = new System.Windows.Forms.Button();
      this.reportViewer1 = new Microsoft.Reporting.WinForms.ReportViewer();
      this.splitContainer1.Panel1.SuspendLayout();
      this.splitContainer1.Panel2.SuspendLayout();
      this.splitContainer1.SuspendLayout();
      this.SuspendLayout();
      // 
      // splitContainer1
      // 
      this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill;
      this.splitContainer1.Location = new System.Drawing.Point(0, 0);
      this.splitContainer1.Name = "splitContainer1";
      this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal;
      // 
      // splitContainer1.Panel1
      // 
      this.splitContainer1.Panel1.Controls.Add(this.button2);
      this.splitContainer1.Panel1.Controls.Add(this.button1);
      // 
      // splitContainer1.Panel2
      // 
      this.splitContainer1.Panel2.Controls.Add(this.reportViewer1);
      this.splitContainer1.Size = new System.Drawing.Size(578, 456);
      this.splitContainer1.SplitterDistance = 105;
      this.splitContainer1.TabIndex = 0;
      // 
      // button2
      // 
      this.button2.Location = new System.Drawing.Point(312, 48);
      this.button2.Name = "button2";
      this.button2.Size = new System.Drawing.Size(75, 23);
      this.button2.TabIndex = 1;
      this.button2.Text = "B";
      this.button2.UseVisualStyleBackColor = true;
      this.button2.Click += new System.EventHandler(this.button2_Click);
      // 
      // button1
      // 
      this.button1.Location = new System.Drawing.Point(132, 48);
      this.button1.Name = "button1";
      this.button1.Size = new System.Drawing.Size(75, 23);
      this.button1.TabIndex = 0;
      this.button1.Text = "A";
      this.button1.UseVisualStyleBackColor = true;
      // 
      // reportViewer1
      // 
      this.reportViewer1.Dock = System.Windows.Forms.DockStyle.Fill;
      this.reportViewer1.LocalReport.ReportEmbeddedResource = "TESTProj.B.rdlc";
      this.reportViewer1.Location = new System.Drawing.Point(0, 0);
      this.reportViewer1.Name = "reportViewer1";
      this.reportViewer1.Size = new System.Drawing.Size(578, 347);
      this.reportViewer1.TabIndex = 0;
      // 
      // Form1
      // 
      this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
      this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
      this.ClientSize = new System.Drawing.Size(578, 456);
      this.Controls.Add(this.splitContainer1);
      this.Name = "Form1";
      this.Text = "Form1";
      this.Load += new System.EventHandler(this.Form1_Load);
      this.splitContainer1.Panel1.ResumeLayout(false);
      this.splitContainer1.Panel2.ResumeLayout(false);
      this.splitContainer1.ResumeLayout(false);
      this.ResumeLayout(false);
    }
    
    2010年9月13日 5:45

回答

  • 書かれたコードは、既存するオブジェクトを一式、別途再作成されていますが、それはとても変なことです。

    データソースが同じ場合は次のようにすれば良いようです(以下のコードはソースが1つだけと想定しています)。
    ソースが異なる場合は、ReportDataSource を作成する必要がありますが、PermanentTraveler さんの場合はデータソースはないのかもしれません。

    private void button2_Click(object sender, EventArgs e)
    {
        // 元のデータソースを退避
        var reportDataSource = reportViewer1.LocalReport.DataSources[0];
       
        // いったんリセット
        reportViewer1.Reset();
       
        // 設定しなおす
        reportViewer1.LocalReport.DataSources.Add(reportDataSource);
        reportViewer1.LocalReport.ReportEmbeddedResource = "TESTProj.B.rdlc";
        reportViewer1.RefreshReport();
    }

    もうひとつ ReportViewer を画面に配置して表示を切り替えた方が楽そうに思いました。

    2010年9月13日 6:55

すべての返信

  • 書かれたコードは、既存するオブジェクトを一式、別途再作成されていますが、それはとても変なことです。

    データソースが同じ場合は次のようにすれば良いようです(以下のコードはソースが1つだけと想定しています)。
    ソースが異なる場合は、ReportDataSource を作成する必要がありますが、PermanentTraveler さんの場合はデータソースはないのかもしれません。

    private void button2_Click(object sender, EventArgs e)
    {
        // 元のデータソースを退避
        var reportDataSource = reportViewer1.LocalReport.DataSources[0];
       
        // いったんリセット
        reportViewer1.Reset();
       
        // 設定しなおす
        reportViewer1.LocalReport.DataSources.Add(reportDataSource);
        reportViewer1.LocalReport.ReportEmbeddedResource = "TESTProj.B.rdlc";
        reportViewer1.RefreshReport();
    }

    もうひとつ ReportViewer を画面に配置して表示を切り替えた方が楽そうに思いました。

    2010年9月13日 6:55
  • TH01さん

    回答ありがとうございます。

    指摘の通り、今回は.rdlcが単純な為、データソースはありません。

    今まで、解決方法が分からず、無駄だと思いながら、オブジェクト一式を再作成していました。コピペをする前に、技術的な理解を深める必要があると感じました。

    質問は、Reset()とRefreshReport()で解決しました。

    ありがとうございます。

    2010年9月13日 7:12