lhmlyx2723356 发表于 2013-9-2 22:49:35

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

本帖最后由 lhmlyx2723356 于 2013-9-2 23:46 编辑

哎,今天公司工作忙了一天,一直没有时间写写东西。所以只能晚上写咯。苦逼啦。。。。。。
昨天发表了Devexpress XtraReports系列第七篇[原创]Devexpress XtraReports 系列 7 创建Drill-Down(向下钻取)报表,今天我们继续。
今天的主题是创建Drill-Through报表。
首先我们来看看最后实现的效果。Demo最后附上。
今天学了弄了一个新东西,就是录制gif图片。哈哈


接下来开始讲解如何一步一步做出这个报表:
第一步,创建如上窗体,拉入控件SimpleButton,DocumentViewer,SplitContainerControl,LabelControl,TextEdit,GroupControl,简单布局我就不多说了,跟上篇一样的布局 ,详见:http://www.dxper.net/thread-1042-1-1.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控件右上角的三角符号,点击红色区域中的其中一项都可以创建打印工具栏。



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




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


第四步,数据库表,布局都做好了,接下来我们就来处理相对应的事件了。
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


羽叶 发表于 2013-9-2 23:40:15

偷工减料,这飞机场算啥福利啊{:2_38:}

qhdxzy 发表于 2013-9-3 17:34:21

支持楼主继续发帖。认真学习中

lhmlyx2723356 发表于 2013-9-3 17:37:42

qhdxzy 发表于 2013-9-3 17:34
支持楼主继续发帖。认真学习中

对你有帮助就行。。哈哈。。顺便赞一个哈。。。我会继续发原创帖的。。

panpan 发表于 2013-9-3 17:39:31

不错,多分享点教程。

lhmlyx2723356 发表于 2013-9-3 17:57:40

panpan 发表于 2013-9-3 17:39
不错,多分享点教程。

会继续分享,不过下次别忘了点赞哈

daijinhui 发表于 2013-10-24 12:41:50

感谢感谢。。
页: [1]
查看完整版本: [原创]Devexpress XtraReports 系列 8 创建Drill-Through报表