5

以下のコードを使用して、 datatablereportviewerにバインドしたいと考えています。reportviewerに結果が表示されません。以下のスクリプトがないのはなぜですか?

// create dataset
DataSet ds = new DataSet("myDataset");

// create datatable
DataTable dt = new DataTable("myDatatable");

// add columns
dt.Columns.Add("column1", typeof(string));
dt.Columns.Add("column2", typeof(string));
dt.Columns.Add("column3", typeof(string));

// insert data rows
dt.Rows.Add("row1-col1", "row1-col2", "row1-col3");
dt.Rows.Add("row2-col1", "row2-col2", "row2-col3");

// add datatable to dataset 
ds.Tables.Add(dt);

// bind datatable to report viewer
this.reportViewer.Reset();
this.reportViewer.ProcessingMode = ProcessingMode.Local;
this.reportViewer.LocalReport.ReportEmbeddedResource = "Test.Report1.rdlc";
this.reportViewer.LocalReport.DataSources.Clear();
this.reportViewer.LocalReport.DataSources.Add(new ReportDataSource(dt.TableName, dt));
this.reportViewer.RefreshReport();
4

3 に答える 3

7

datatable を reportviewer にバインドする方法の答えを見つけました。ここで共有すると、他の人にも役立つかもしれません。

  1. clsTables クラスReport1.rdlc ファイルreportViewer1をフォームに追加します。
  2. 次に、 reportViewer1の右上隅をクリックし、[ choose report ]をTest.Report1.rdlcに設定します。
  3. Report1.rdlc について
    • [新規] をクリックし、
    • データセット名を追加: dsBody データソース: Test 利用可能なデータセット: clsTables
    • [ OK] をクリックします。
    • Report1.rdlc を右クリックしてInsert Tableを選択し、dsBody 要素 ( Column0、Colum1、Column2 ) をReport1.rdlc tableにドラッグします。
Namespace Test{
    public class clsTables {
        // constructor
        public clsTables(string col0, string col1, string col2) {
            this.Column0= col0;
            this.Column1= col1;
            this.Column2= col2;
        }

       // properties
       public string Column0{ get; set; }
       public string Column1{ get; set; }
       public string Column2{ get; set; }
    }
}

namespace Test{
    public class clsMain{
        public void BindToRepprtViewer() {        
            // create dataset
            DataSet ds = new DataSet("myDataset");

            // create datatable
            DataTable dt = new DataTable("myDatatable");

            // add columns
            dt.Columns.Add("column1", typeof(string));
            dt.Columns.Add("column2", typeof(string));
            dt.Columns.Add("column3", typeof(string));

            // insert data rows
            dt.Rows.Add("row1-col1", "row1-col2", "row1-col3");
            dt.Rows.Add("row2-col1", "row2-col2", "row2-col3");

            // add datatable to dataset 
            ds.Tables.Add(dt);

            // save rows to rowList 
            List<clsTables> rowList = new List<clsTables>();
            rowList .Clear();
            foreach (DataRow row in dt.Rows) {
                rList.Add(new clsTables(Convert.ToInt32(row.ItemArray[0]), row.ItemArray[1].ToString(), row.ItemArray[2].ToString()));
            }

            // binding rowList to bs
            BindingSource bs = new BindingSource();
            bs.DataSource = rowList;

            // binding bs to rds
            ReportDataSource rds = new ReportDataSource();
            rds.Name = "dsBody";
            rds.Value = bs;

            // binding rds to report viewer
            reportViewer1.Reset();
            reportViewer1.LocalReport.ReportEmbeddedResource =  "Test.Report1.rdlc";
            reportViewer1.LocalReport.DataSources.Clear();
            reportViewer1.LocalReport.DataSources.Add(rds);
            reportViewer1.RefreshReport();
        }
    }
}
于 2013-04-05T10:24:38.703 に答える
0

私が違うことをする唯一のことは、私がすることです:

reportViewer1.LocalReport.DataSources.Clear();

データソースを設定する前に、次のことを行います。

reportViewer1.LocalReport.Refresh(); 

reportviewer コントロールで RefreshReport() を呼び出す代わりに。

ReportEmbeddedResourceが適切に何をするのかわかりません。おそらくそれも取り除いてみてください。

于 2013-04-03T05:17:27.733 に答える