• 使用RDLC报表(四)钻取式报表


    本文内以MSServer自带Northwind库文件内的Customers及Orders这两个表为例,建立两个报表文件,在查询得出Customers的表数据后,点击此表内的CustomerID数据,报表将转入至下一个报表,并显示与之相关的Orders的数据,即VS中所谓的钻取式报表。

    1、打开一个工程,并新建一个From,放入一个Button及一个ReportViewer控件。
    2、在工程内新建一个数据源,连接到Northwind库文件,显示Customers及Orders这两个表
    3、新建一个报表文件,并以表格的形式来显示数据,将Customers表内的CustomerID、CompanyName及Address三个字段放入,形成一份有表头及数据的简单报表,并将此报表保存命名为customerReport
    4、再建一个报表文件,与customerReport相同,也以表格的形式来显示报表,将Orders内的OrderID、CustomerID、ShipName及OrderDate四个字段放入表格内,报表保存为orderReport
    5、orderReport的数据源根据主报表customerReport的数据来确定数据源的数据,查看表格的数据集名称,我的显示为NorthwindDataSet_Orders,也可以自己另建一个,具体方法见我的《RDLC报表(二)》
    6、再打开customerReport报表,将CustomerID设置成为可点击的索引字段,以便转入下一个报表。选择CustomerID字段,按鼠标右键,在”文本框属性“窗口中,选择”导航“选项卡,在下面的”超链接“中选择”跳至报表“,在报表名称中选择”orderReport“,再按下后面的”参数...“按钮,输入一个参数名称,如customerid,参数值选择=Fields!CustomerID.Value。为了与其它数据相区分,可以将此列数据根据自己的习惯改变颜色或加下划线
    7、在orderReport中,设置一个报表参数,与CurtomerReprot中的名称相同,以接收父表中传入的参数
    8、新建两个取得数据的方法,一个从Customers中取得数据集,另一个从Orders中取得数据集,且带参数。此两个方法可以自己编写类库来实现,也可以在VS的数据集内添加。为了演示方便,我直接使用了Customers的GetData(),并编写了一个Orders的GetDataByCustomerID(@cid)的方法。
    9、在From的Button中编写如下代码:
            private void button2_Click(object sender, EventArgs e)
            
    {
                NorthwindDataSet.CustomersDataTable dt1 
    = new NorthwindDataSetTableAdapters.CustomersTableAdapter().GetData();
                
    this.reportViewer1.LocalReport.ReportEmbeddedResource = "TestReport.customerReport.rdlc";
                
    this.reportViewer1.LocalReport.DataSources.Clear();
                
    this.reportViewer1.LocalReport.DataSources.Add(new ReportDataSource("NorthwindDataSet_Customers", dt1));
                
    this.reportViewer1.RefreshReport();
            }


    10、使用报表的Drillthrough事件,当选择了钻取项时会发生此事件,给下一个报表取值,代码如下:
            private void reportViewer1_Drillthrough(object sender, DrillthroughEventArgs e)
            
    {
                LocalReport lp 
    = (LocalReport)e.Report;
                
    string customerid = lp.GetParameters()["customerid"].Values[0].Trim();

                lp.DataSources.Clear();
                lp.DataSources.Add(
    new ReportDataSource("NorthwindDataSet_Orders",
                    
    new NorthwindDataSetTableAdapters.OrdersTableAdapter().GetDataByCustomerID(customerid)));
            }

    运到结果:
    运行第一份报表:


    钻取后运行第二份报表:
  • 相关阅读:
    Intent
    What should we do next in general after collecting relevant data
    NOTE FOR Secure Friend Discovery in Mobile Social Networks
    missing pcap.h
    after building Android Source code
    plot point(one column)
    When talking to someone else, don't infer that is has been talked with others at first. It may bring repulsion to the person who is talking with you.
    进程基本知识
    Python input和raw_input的区别
    强制 code review:reviewboard+svn 的方案
  • 原文地址:https://www.cnblogs.com/wjhx/p/666928.html
Copyright © 2020-2023  润新知