zoukankan      html  css  js  c++  java
  • [原创]Devexpress XtraReports 系列 6 创建并排报表

    昨天我们已经介绍了如何创建交叉报表,详见:[原创]Devexpress XtraReports 系列 5 创建交叉报表

    今天我们继续我们的XtraReports系列。Demo和数据库文件最后会附上。

    今天的主题是:创建并排报表

    什么是并排报表呢?

    按照我个人理解:并排报表是把两张或者两张以上的报表,放在一个报表页面。

    注:为了方便,本示例使用同一个数据源,但是您可以使用相同的方法,而在一个报表文档中显示两个完全不同的 (使用不同数据源的) 报表。

    依照惯例,我们先来看看我们最后实现的效果,如图:

    QQ截图20130830213558

    开始讲解。


    第一步:窗体布局。

    新建一个WinForm窗体,,拉入第三方控件SimpleButton,DocumentViewer,SplitContainerControl,LabelControl,TextEdit,GroupControl,无非就是设置空间Dock属性,还有字体Text属性等,简单布局我就不多阐述了。可以参考系列第一篇。

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

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

    QQ截图20130830214457 

    第二步:创建两个个Devexpress XtraReport报表文件。一个是明细报表DetailSideBySideRpt(用于绑定到最后显示的并排报表MasterSideBySideRpt),一个是最后显示的并排报表MasterSideBySideRpt  如图:

    报表布局步骤如下:(不知道为什么我的设计器是中文的,英文的朋友找到相对应的就行了)

    首先,建立一个DetailSideBySideRpt文件 如图:

    QQ截图20130830215021


    然后新建一个MasterSideBySideRpt,如图:

    QQ截图20130830215630

    那如何把我们新建的DetailSideBySideRpt报表,并排显示到MasterSideBySideRpt呢?

    方法一:如图:

    QQ截图20130830215827

    注意:我一开始不知道为什么一直不能把【创建并排报表.DetailSideBySideRpt】选择到ReportSource,后来重新生成解决方案,就可以了。如果大家遇到选不上的时候,请试试重新生成解决方案。

    方法二:例如代码方式:

    this.xrSubreport1.ReportSource = new 创建并排报表.DetailSideBySideRpt();

    this.xrSubreport2.ReportSource = new 创建并排报表.DetailSideBySideRpt();//这里我并排的两张报表都使用了同一个DetailSideBySideRpt,可以使用不同的

     

    第三步,准备数据源,如图:

    QQ截图20130830220333

    第四步,一切准备就绪,接下来就来处理方法事件了。

    a,从数据库中获取绑定数据源

    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 SideBySideRptData where 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, "SideBySideRpt"); ;
                   con.Close();
               }
               catch (Exception ex)
               {
                   throw ex;
               }
               return ds;
           }

    b,修改DetailSideBySideRpt报表文件默认构造函数,让其可以接收数据源并绑定字段

    public DetailSideBySideRpt(DataSet ds)
    {
        InitializeComponent();
        this.DataSource = ds;
        this.xrRichText1.DataBindings.Add("Text", ds, "name");
        this.xrRichText2.DataBindings.Add("Text", ds, "birthday");
        this.xrRichText3.DataBindings.Add("Text", ds, "description");
    }

    从上面可以很容易看出,我们只绑定了姓名,生日,简介三个字段,那如何绑定图片呢?

    我们可以在XRPictureBox的BeforePrint事件中处理,从本地存放图片的文件夹中获取图片(在此之前应该把图片放到指定目录下),并绑定。

    如图:把图片放到程序运行目录

    QQ截图20130830220903

    private void xrPictureBox1_BeforePrint(object sender, System.Drawing.Printing.PrintEventArgs e)
    {
        string path = System.Environment.CurrentDirectory + "\" + GetCurrentColumnValue("pictureurl");//从程序运行目录下获取

        xrPictureBox1.Sizing = DevExpress.XtraPrinting.ImageSizeMode.ZoomImage;//设置图片显示模式
        ((XRPictureBox)sender).Image = Image.FromFile(path);
    }

    c,根据最终的效果图结合我们的数据源图,可以发现左边显示体育明星,右边显示影视明星,如何做到的呢?

    其实,我们只需要处理一下事件。利用FilterString属性过滤数据源即可。

    private void xrSubreport1_BeforePrint(object sender, System.Drawing.Printing.PrintEventArgs e)
    {
          ((XRSubreport)sender).ReportSource.FilterString = "category =='体育明星'";
    }

    private void xrSubreport2_BeforePrint(object sender, System.Drawing.Printing.PrintEventArgs e)
    {
        ((XRSubreport)sender).ReportSource.FilterString = "category =='影视明星'";
    }

    d,在这个示例中我利用代码的形式给MasterSideBySideRpt绑定数据源

    public MasterSideBySideRpt(DataSet ds)
         {
             InitializeComponent();
             this.xrSubreport1.ReportSource = new 创建并排报表.DetailSideBySideRpt(ds);
             this.xrSubreport2.ReportSource = new 创建并排报表.DetailSideBySideRpt(ds);
         }

    e,最后我们处理显示报表按钮事件。把数据源传递给报表,并展示出来。

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

    到此,我们就把一个并排报表完成了。。 个人感觉这篇写的不是很顺,有疑问的话,大家可以看看源代码。


    希望对大家有帮助。。。最后附上源码以及数据库备份文件

    Demo地址:http://yunpan.cn/QXXFGrMsgggYH  访问密码 4648

  • 相关阅读:
    JIT动态编译器的原理与实现之Interpreter(解释器)的实现(三)
    java工作之后需要看的书籍
    WebService 之 REST vs SOAP
    消息队列
    dreamweaver cs6 的破解方法
    jquery mobile页面跳转后js不执行的问题
    JQueryMobile页面跳转参数的传递解决方案
    HTMl5的sessionStorage和localStorage
    phoneGap、JQueryMobile 简介及中文API地址
    Android 禁止响应屏幕翻转
  • 原文地址:https://www.cnblogs.com/lhmlyx2723356/p/3294373.html
Copyright © 2011-2022 走看看