开发者论坛

 找回密码
 注册 (请使用非IE浏览器)
查看: 10783|回复: 7

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

[复制链接]

0

精华

935

贡献

265

赞扬

帖子
4122
软币
9958
在线时间
366 小时
注册时间
2013-7-21
发表于 2013-8-31 09:54:34 | 显示全部楼层 |阅读模式
本帖最后由 lhmlyx2723356 于 2013-8-31 09:56 编辑

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

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

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

什么是并排报表呢?

按照我个人理解:并排报表是把两张或者两张以上的报表,放在一个报表页面。
注:为了方便,本示例使用同一个数据源,但是您可以使用相同的方法,而在一个报表文档中显示两个完全不同的 (使用不同数据源的) 报表。
依照惯例,我们先来看看我们最后实现的效果,如图:
QQ截图20130830213558.png

开始讲解。

第一步:窗体布局。

新建一个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.png


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

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

首先,建立一个DetailSideBySideRpt文件 如图:
QQ截图20130830215021.png



然后新建一个MasterSideBySideRpt,如图:
QQ截图20130830215630.png

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

方法一:如图:
QQ截图20130830215827.png

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

方法二:例如代码方式:
this.xrSubreport1.ReportSource = new 创建并排报表.DetailSideBySideRpt();
this.xrSubreport2.ReportSource = new 创建并排报表.DetailSideBySideRpt();//这里我并排的两张报表都使用了同一个DetailSideBySideRpt,可以使用不同的

第三步,准备数据源,如图:
QQ截图20130830220333.png








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

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.png

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();
}

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

接下来是屌丝送福利时间。哈哈
201242594733642.jpg


别忘了点赞呀。。。嘿嘿。。您的赞是我最大的动力。。。

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

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

评分

参与人数 10贡献 +8 赞扬 +10 收起 理由
wlb263330234 + 1 Thanks
gdbobpan + 1 赞一个
黎明宇 + 1 赞一个
血狼 + 1 很给力
DevilHero + 1 Thanks

查看全部评分

回复

使用道具 举报

0

精华

3

贡献

18

赞扬

帖子
174
软币
4587
在线时间
814 小时
注册时间
2013-7-4
发表于 2013-10-15 10:59:38 | 显示全部楼层
dev的东西就是好用,这个报表相当给力
回复

使用道具 举报

0

精华

1

贡献

59

赞扬

帖子
94
软币
582
在线时间
48 小时
注册时间
2013-11-15
发表于 2014-1-8 08:43:34 | 显示全部楼层
好东西一定要顶了
回复

使用道具 举报

0

精华

0

贡献

6

赞扬

帖子
37
软币
287
在线时间
28 小时
注册时间
2013-11-19
发表于 2014-1-11 23:59:51 | 显示全部楼层
好东西一定要顶了
回复

使用道具 举报

0

精华

2

贡献

0

赞扬

帖子
10
软币
91
在线时间
1 小时
注册时间
2014-5-3
发表于 2014-5-3 22:58:05 | 显示全部楼层
不赞都对不起 版主
回复

使用道具 举报

0

精华

0

贡献

0

赞扬

帖子
16
软币
102
在线时间
2 小时
注册时间
2015-3-21
发表于 2015-3-21 21:35:00 | 显示全部楼层
不错,可惜就是没法下载了
回复

使用道具 举报

0

精华

0

贡献

0

赞扬

帖子
3
软币
93
在线时间
4 小时
注册时间
2015-8-20
发表于 2015-8-21 22:57:52 | 显示全部楼层
版主能不能把demo发我啊 6955599@qq.com
回复

使用道具 举报

0

精华

4

贡献

0

赞扬

帖子
70
软币
342
在线时间
25 小时
注册时间
2015-10-2
发表于 2016-1-27 21:22:08 | 显示全部楼层
Dev项目,我先抛砖,求赞扬! [修改]
回复

使用道具 举报

Archiver|手机版|小黑屋|开发者网 ( 苏ICP备08004430号-2 )
版权所有:南京韵文教育信息咨询有限公司

GMT+8, 2024-4-28 04:27

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表