昨天发表了Devexpress XtraReports系列第六篇[原创]Devexpress XtraReports 系列 6 创建并排报表,今天我们继续。

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

首先我们来看看最后实现的效果。Demo最后附上。点击隐藏明细,会把明细收缩,点击显示明细会把明细显示出来。

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

第一步,创建如上窗体,拉入控件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控件右上角的三角符号,点击红色区域中的其中一项都可以创建打印工具栏。

第二步,创建一个DrillDown报表文件。如图:

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

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

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

public DrillDrownRpt(DataSet ds)//修改构造函数 {
    InitializeComponent();
    Bind(ds);
}

private void Bind(DataSet ds)
{
    this.DataSource = ds;
    this.DataMember = "Dept";
    DetailReport.DataMember = "RelationColumn";
    DetailReport.DataSource = ds;

//把dept_id属性绑定到lblShowHide的Tag属性,当点击lblShowHide(显示明细/隐藏明细是)时,可以根据dept_id去判断显示隐藏明细情况。
    this.lblShowHide.DataBindings.Add("Tag", ds, "Dept.dept_id");

this.xrLabel3.DataBindings.Add("Text", ds, "Dept.dept_name");
    this.xrTableCell1.DataBindings.Add("Text", ds, "RelationColumn.user_id");
    this.xrTableCell2.DataBindings.Add("Text", ds, "RelationColumn.username");
}

const string sShowDetail = "显示明细";
const string sHideDetail = "隐藏明细";
ArrayList expandedValues = new ArrayList();

//判断是否存在部门ID

bool ShouldShowDetail(int catID)
{
    return expandedValues.Contains(catID);
}

//根据lblShowHide的Tag属性去判断lblShowHide显示文本是显示明细还是隐藏明细

private void lblShowHide_BeforePrint(object sender, System.Drawing.Printing.PrintEventArgs e)
{
    XRLabel label = (XRLabel)sender;

//(int)label.Tag返回的是dept_id,调用ShouldShowDetail 方法,如果true则让lblShowHide显示隐藏明细。反之,显示显示明细

if (ShouldShowDetail((int)label.Tag))

{
        label.Text = sHideDetail;
    }
    else
    {
        label.Text = sShowDetail;
    }
}

private void DetailReport_BeforePrint(object sender, System.Drawing.Printing.PrintEventArgs e)
{
    e.Cancel = !ShouldShowDetail((int)GetCurrentColumnValue("dept_id"));
}

//鼠标移动到lblShowHide时,鼠标样式变成手形

private void lblShowHide_PreviewMouseMove(object sender, PreviewMouseEventArgs e)
{
    Cursor.Current = Cursors.Hand;
}

private void lblShowHide_PreviewClick(object sender, PreviewMouseEventArgs e)
{
    int index = (int)e.Brick.Value;
    bool showDetail = ShouldShowDetail(index);
    if (showDetail)
    {
        expandedValues.Remove(index);
    }
    else
    {
        expandedValues.Add(index);
    }
    CreateDocument();
}

b,获取数据源

private DataSet BindRpt()
      {
          DataSet ds = new DataSet();
          try
          {
              //连接数据源,给DrillDrownRpt绑定数据源,包含两个数据表
              SqlConnection con = new SqlConnection("Data Source=(local);Integrated Security=SSPI;Initial Catalog=DxReports");
              SqlDataAdapter adapter;
              con.Open();
              adapter = new SqlDataAdapter("SELECT * FROM Dept", con);
              adapter.Fill(ds, "Dept");
              adapter = new SqlDataAdapter("select  * from  Users", con);
              adapter.Fill(ds, "User");
              con.Close();

//给数据集建立主外键关系
              DataColumn ParentColumn = ds.Tables["Dept"].Columns["dept_id"];
              DataColumn ChildColumn = ds.Tables["User"].Columns["dept_id"];
              DataRelation Rel = new DataRelation("RelationColumn", ParentColumn, ChildColumn);
              ds.Relations.Add(Rel);
          }
          catch (Exception ex)
          {
              throw ex;
          }
          return ds;
      }

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

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

到此,报表就向下钻取报表就完成了。

希望对初学者有点帮助。谢谢。

Demo地址:http://yunpan.cn/QXzZnfJVPHQ7I  访问密码 4a86

[原创]Devexpress XtraReports 系列 7 创建Drill-Down(向下钻取)报表的更多相关文章

  1. [原创]Devexpress XtraReports 系列 4 创建多栏报表

    昨天我们完成了 [原创]Devexpress XtraReports 系列 3 创建主从报表 今天我们继续学习新的一种报表模式:多栏报表.(Demo源码,数据库最后附上) 或许很多人会问什么是多栏报表 ...

  2. [原创]Devexpress XtraReports 系列 5 创建交叉报表

    昨天我们已经介绍了如何创建多栏报表,详见:[原创]Devexpress XtraReports 系列 4 创建多栏报表 今天我们继续我们的XtraReports系列.Demo和数据库文件最后会附上. ...

  3. [原创]Devexpress XtraReports 系列 6 创建并排报表

    昨天我们已经介绍了如何创建交叉报表,详见:[原创]Devexpress XtraReports 系列 5 创建交叉报表 今天我们继续我们的XtraReports系列.Demo和数据库文件最后会附上. ...

  4. [原创]Devexpress XtraReports 系列 8 创建Drill-Through报表

    哎,今天公司工作忙了一天,一直没有时间写写东西.所以只能昨天晚上加班写咯.苦逼啊...... 昨天发表了Devexpress XtraReports系列第七篇[原创]Devexpress XtraRe ...

  5. [原创]Devexpress XtraReports 系列 9 创建邮件合并报表

    昨天发表了Devexpress XtraReports系列第八篇[原创]Devexpress XtraReports 系列 8 创建Drill-Through报表,今天我们继续. 今天的主题是创建邮件 ...

  6. [原创]Devexpress XtraReports 系列 10 创建标签报表

    今天这篇是Dx Reports 基础初级系列的最后一篇了.以后如果有什么高级的应用,应该另开一个中级使用系列. 昨天发表了Devexpress XtraReports系列第九篇[原创]Devexpre ...

  7. [原创]Devexpress XtraReports 系列 3 创建主从报表

    昨天写了系列的第二篇Devexpress XtraReports 系列 2 创建表格报表 . 今天我们来继续系列 3 创建主从报表 首先我们来看看最后实现的效果.Demo最后附上. 开始吧. 第一步, ...

  8. [原创]Devexpress XtraReports 系列 2 创建表格报表

    昨天发表了Devexpress XtraReports系列开篇,今天我们继续. 今天的主题是创建表格报表. 首先我们来看看最后实现的效果.Demo最后附上. 接下来开始讲解如何一步一步做出这个报表: ...

  9. [原创]Devexpress XtraReports 系列 1 创建静态报表

    在各种管理系统中,报表是必不可少的.报表是数据最直观体现的方式之一 以前,屌丝我是微软的忠实粉丝,所以报表工具就是微软自带的RDLC... 不可否认的是RDLC的功能是非常强大的.能够满足绝大多数的要 ...

随机推荐

  1. 使用Less color函数创建专业网站配色方案

    Less提供了很多实用的函数专门用于定义和操作色彩.本文将介绍如何使用这些函数来 帮助你控制色彩,创造合适的色彩搭配,并且保持网站的一致性和专业性 color spinning spin()函数允许我 ...

  2. Qt之等待提示框(QPropertyAnimation)

    简述 之前分享过QLabel可以通过QMovie播放gif图片,可以实现等待提示框,今天主要使用动画QPropertyAnimation来进行实现! 数据加载的时候,往往都需要后台线程进行数据请求,而 ...

  3. HDU 5033 (单调栈维护凸包) Building

    题意: 一个人在x轴上,他的左右两侧都有高楼,给出楼的横坐标Xi和高度Hi还有人的位置pos,求人所能看到的天空的最大角度. 分析: 将建筑物和人的位置从左到右排序,对于每个位置利用栈求一次人左边建筑 ...

  4. 对比C++中的指针和引用

    指针和引用在形式上比较好区分,由于有很多相似的功能,因此在使用上容易混淆.因此有必要对指针和引用进行对比,以便于在使用时使程序正确高效. 1.引用不可以为空,而指针可以为空. 我们知道引用是对象的别名 ...

  5. UTF8存储与显示

    存储肯定是二进制存储,同一个字符(汉子)在不同的字符集下有对应的值,一个字符集相当于一个密码表,键名为字符,键值为二进制数(可表示为十进制,十六进制) UTF8是一个unicode字符集的编码规则,也 ...

  6. 【解题报告】PKU 2826 An Easy Problem?!

    原题链接:http://poj.org/problem?id=2826 一题很蛋疼的一题.目前为止还有一个问题我没搞清楚,问题注在代码中. 题目大意: 外面下雨了,农民Johnoson的bull(?? ...

  7. Linux 设备驱动 Edition 3

    原文网址:http://oss.org.cn/kernel-book/ldd3/index.html Linux 设备驱动 Edition 3 By Jonathan Corbet, Alessand ...

  8. cscope 的使用

    一. cscope安装 1.软件下载:http://sourceforge.net/project/showfiles.php?group_id=4664 2.软件安装: ./configure -- ...

  9. APP打包上线应注意的问题!

    咱们只谈技术不谈业务!关系到怎么推广怎么让软件发扬光大,其实归根结底这都和公司的现状和产品经理有直接的联系,与我们程序员关系不太密切.   我总结的上线项目和我做的项目以及公司外包过来的项目升级再次发 ...

  10. OpenGL学习之路(三)

    1 引子 这些天公司一次次的软件发布节点忙的博主不可开交,另外还有其它的一些事也占用了很多时间.现在坐在电脑前,在很安静的环境下,与大家分享自己的OpenGL学习笔记和理解心得,感到格外舒服.这让我回 ...