对于ReportViewer控件的使用,网上很多文章介绍都是直接使用ReportViewer控件右上方的三角按钮来绑定数据源和表,感觉不是很方便,那能不能动态来进行绑定呢,我做了个实验,暂时没发现什么问题。记录如下:

首先,仍然是使用VS中添加项的方式添加了两个DataSet,分别命名为DataSet1和DataSet2,它们都有一个DataTable,分别是DataTable1和DataTable2。每个DataTable上都添加了一个TableAdaptor,分别是DataTable1TableAdaptor1和DataTable2TableAdaptor2。

其次,仍然使用VS中添加项的方式针对两个数据源都添加了一个报表,分别为Report1.rdlc和Report2.rdlc,对这两个表分别进行界面设计。

在主窗体,添加一个Button1,目的是点击Button1后加载报表内容,并添加一个ReportViewer对象,其名称为reportViewer1。

动态生成的对象需包括:BindingSource, DataSet和TableAdapter,另外,在设置这些对象的名字域时要注意按注释里的说明进行书写,否则加载报表显示时可能出现“尚未为数据源XXX提供数据源实例”的错误提示。

以下例子的目的是点击Button1后加载DataSet1中DataTable1的相关数据,报表

         private void button1_Click(object sender, EventArgs e)
        {

           BindingSource tBindingSource = new BindingSource();
            WindowsApplication3.DataTable1TableAdaptor1.sqlInfoTableAdapter ds1TableAdapter=new WindowsApplication3.DataTable1TableAdaptor1.sqlInfoTableAdapter (); /*直接new一个DataTable1中已经创建好的Adapter*/
            WindowsApplication3.DataSet1 tDataSet = new WindowsApplication3.DataSet1();
            tDataSet.DataSetName = "tDataSet"; /*必须是本DataSet变量的名字*/
            tDataSet.SchemaSerializationMode = System.Data.SchemaSerializationMode.IncludeSchema;
            tBindingSource.DataMember = "DataTable1";/*必须是所绑定的数据源DataTable的名字*/
            tBindingSource.DataSource = tDataSet;
            tBindingSource.Position = 0;
            ds1TableAdapter.ClearBeforeFill = true;
            ReportDataSource rds = new ReportDataSource();
            rds.Name = "DataSet1_DataTable1";/*必须是数据源DataSet名_数据源DataTable名*/
            rds.Value = tBindingSource;
            this.reportViewer1.Reset();
            this.reportViewer1.LocalReport.DataSources.Clear();
            this.reportViewer1.LocalReport.DataSources.Add(rds);
            this.reportViewer1.LocalReport.ReportEmbeddedResource = "WindowsApplication3.Report1.rdlc";/*必须是相应报表rdlc文件在工程中的全路径名*/
            ReportParameter rp = new ReportParameter("begin_time", this.dateTimePicker1.Value.ToString());
            this.reportViewer1.LocalReport.SetParameters(new ReportParameter[] { rp });
            ds1TableAdapter.Fill(tDataSet.viewG4OvenInfo, dateTimePicker1.Value);
            this.reportViewer1.RefreshReport();

}

 

同理,在button2中可增加对DataSet2的数据源的绑定。

通过点击不同的按钮,ReportViewer控件中能够显示不同的表内容