zoukankan      html  css  js  c++  java
  • [原创]Devexpress XtraReports 系列 8 创建Drill-Through报表

    哎,今天公司工作忙了一天,一直没有时间写写东西。所以只能昨天晚上加班写咯。苦逼啊。。。。。。

    昨天发表了Devexpress XtraReports系列第七篇[原创]Devexpress XtraReports 系列 7 创建Drill-Down(向下钻取)报表,今天我们继续。

    今天的主题是创建Drill-Through报表。

    首先我们来看看最后实现的效果。Demo最后附上。

    今天学了弄了一个新东西,就是录制gif图片。哈哈

    111

    接下来开始讲解如何一步一步做出这个报表:

    第一步,创建如上窗体,拉入控件SimpleButton,DocumentViewer,SplitContainerControl,LabelControl,TextEdit,GroupControl,简单布局我就不多说了,跟上篇一样的布局 ,详见:http://www.cnblogs.com/lhmlyx2723356/p/3286101.html

    提示一点:DocumentViewer控件一开始是没有打印工具栏的,以前12.几的版本,添加打印工具栏是拖入PrintSystem控件,但是13.1.5我发现没有了,后来在官网找到了答案。控件12.几的控件PrintControl, PringBarManager, PrintRibbonController都集成到了DocumentViewer ,详情请参考http://www.devexpress.com/Support/Center/Question/Details/Q504260

    那13.1.5如何添加打印工具栏呢?如图:选中DocumentViewer控件右上角的三角符号,点击红色区域中的其中一项都可以创建打印工具栏。

    QQ20130830214457_thumb13

    第二步,创建一个DrillThroughRpt报表文件和一个点击DrillThroughRpt报表跳转到的明细报表DrillThroughRpt2报表。如图:

    QQ截图20130902215656

    QQ截图20130902221333

    第三步,我们利用数据库做一张简单的表并输入一些测试值。如图:

    QQ20130901123219_thumb2

    第四步,数据库表,布局都做好了,接下来我们就来处理相对应的事件了。输入文本框的值,点击按钮把查询出来的数据源绑定到报表中

    a,修改DrillThroughRpt报表文件的构造函数,让它在实例化的时候可以接收数据源。

    public DrillThroughRpt(DataSet ds)
          {
              InitializeComponent();
              this.DataSource = ds;
              this.DataMember = "Dept";
              this.xrLabel3.DataBindings.Add("Text", ds, "dept_name");
          }

    //把当前行赋值到Label的Tag属性

    private void xrLabel3_BeforePrint(object sender, System.Drawing.Printing.PrintEventArgs e)
          {
              ((XRLabel)sender).Tag = GetCurrentRow();
          }

          private void xrLabel3_PreviewClick(object sender, PreviewMouseEventArgs e)
          {
              DrillThroughRpt2 detailReport = new DrillThroughRpt2();

              //传递参数
              detailReport.dept_id.Value = (int)((DataRowView)e.Brick.Value).Row["dept_id"];
              detailReport.dept_name.Value = ((DataRowView)e.Brick.Value).Row["dept_name"].ToString();
              detailReport.ShowPreviewDialog();
          }

    b,设置DrillThroughRpt报表2

    技巧:最开始,我也不知道如何定义参数,你可以通过向导方式去生成报表,然后再去Designer.cs文件查看生成的代码,我们就知道如何用代码方式去生成一些我们不知道的东西了。

    //定义传递参数dept_id,dept_name

    public DevExpress.XtraReports.Parameters.Parameter dept_id = new DevExpress.XtraReports.Parameters.Parameter();
    public DevExpress.XtraReports.Parameters.Parameter dept_name = new DevExpress.XtraReports.Parameters.Parameter();


           public DrillThroughRpt2()
           {
               InitializeComponent();


                this.dept_id.Name = "dept_id";
               this.dept_id.Type = typeof(int);

               this.dept_name.Name = "dept_name";
               this.xrLabel2.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] {
               new DevExpress.XtraReports.UI.XRBinding(dept_name, "Text", "")});

               this.FilterString = "dept_id = ?dept_id";
               this.Parameters.AddRange(new DevExpress.XtraReports.Parameters.Parameter[] {
               this.dept_id,
               this.dept_name});
               this.RequestParameters = false;

               this.xrTableCell1.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] {
               new DevExpress.XtraReports.UI.XRBinding("Text", null, "user_id")});

               DataSet ds = Bind();

               this.DataSource = ds;
               this.xrTableCell1.DataBindings.Add("Text", ds, "user_id");
               this.xrTableCell2.DataBindings.Add("Text", ds, "username");
           }

          //获取数据源

           public DataSet Bind()
           {
               DataSet ds = new DataSet();
               try
               {
                   SqlConnection con = new SqlConnection("Data Source=(local);Integrated Security=SSPI;Initial Catalog=ReportDeom");
                   SqlDataAdapter adapter;
                   con.Open();
                   adapter = new SqlDataAdapter("SELECT * FROM Users", con);
                   adapter.Fill(ds, "Users"); ;
                   con.Close();
               }
               catch (Exception ex)
               {

                   throw ex;
               }

               return ds;
           }

    c,获取数据源

    private DataSet BindRpt()
           {
               DataSet ds = new DataSet();
               try
               {
                   SqlConnection con = new SqlConnection("Data Source=(local);Integrated Security=SSPI;Initial Catalog=ReportDeom");
                   SqlDataAdapter adapter;
                   con.Open();
                   SqlCommand cmd = new SqlCommand("SELECT * FROM Dept where dept_name=@name OR @name='' ", con);
                   SqlParameter[] paras = new SqlParameter[]{
                       new SqlParameter("@name",txtName.Text.Trim())
                   };
                   cmd.Parameters.AddRange(paras);
                   adapter = new SqlDataAdapter(cmd);
                   adapter.Fill(ds, "DrillThroughRpt"); ;
                   con.Close();
               }
               catch (Exception ex)
               {
                   throw ex;
               }
               return ds;
           }

    d,单击按钮,绑定数据到报表中

    private void btnShowReport_Click(object sender, EventArgs e)
        {
            DataSet ds = BindRpt();
            DrillThroughRpt Rpt = new DrillThroughRpt(ds);
            this.documentViewer1.DocumentSource = Rpt;
            Rpt.CreateDocument();
        }

    到此,报表就Drill-Through报表就完成了。

    个人表达能力有限,如果有疑问,欢迎大家下载示例代码,一目了然。

    Demo地址:http://yunpan.cn/QXpSNHXT5PBFr  访问密码 5817

  • 相关阅读:
    java基础面试题(一)
    关于Redis的十个高频面试问题
    postgres中的merge join
    cgdb调试postgresql
    再见了,程序员!
    掌握这个小技巧,让你的 C++ 编译速度提升 50 倍!
    C语言修仙大法!基础知识全复习(纯干货)!!!
    一锅端了!北京朝阳一互联网公司被端,警方上门,23人被带走…
    C++入口不是main?知乎上都快打起来了,你们不要再打了啦!
    不用创建项目,直接在 VS 里快速测试 C/C++ 代码 !
  • 原文地址:https://www.cnblogs.com/lhmlyx2723356/p/3298029.html
Copyright © 2011-2022 走看看