XtraReport应用(1)(XtraReport From File)

最近在研究dev xtraReport的应用,虽然从08年就开始接触dev,但是它的报表还是头次接触。在网上找了很多资料,但看来看去无非就那么两篇,呵呵,真是天下文章一大抄!相对水晶报表,xtraReport在设计上是很强大的,在功能上也要比水晶报表完善很多。但是在这里要吐槽一下,dev的demo写的真的不咋地,效果是出来了,找代码还得找半天还不应定能找到。

言归正传,今天主要说的单表显现和简单主从表显现实现。相对于国外报表来讲,国内的报表很有中国特色,中规中矩的,所以也给设计人员带来了些许方便。先来说说单表的报表实现。我在这里使用的是xtraReport的设计器来设计的报表,有兴趣的可以从demo-xtraReports-RibbonReportDesigner打开它。在设计上,和水晶报表的设计有不同,但是参数的标识也是用"[]"的。

1、单表

报表设计

网页运行效果

后台代码(Ps:数据库不是我的,大家不要喷我~~)

数据层

View Code
 1 public DataTable GetData()
 2         {
 3             using (SqlConnection conn = new SqlConnection(connectionString))
 4             {
 5                 string _commandSql="SELECT [ID],[名称],[添加时间] FROM [部门表]";
 6                 using (SqlDataAdapter da = new SqlDataAdapter(_commandSql, conn))
 7                 {
 8                     DataSet ds = new DataSet();
 9                     da.Fill(ds);
10                     return ds.Tables[0];
11                 }
12             }
13         }

实体类

View Code
1 public class Dept
2     {
3         public string ID{get;set;}
4         public string Name { get; set; }
5         public DateTime?  CreateTime { get; set; }
6     }

前台页面

View Code
 1 <dx:ReportToolbar ID="ReportToolbar1" runat="server" ReportViewerID="ReportViewer1" ShowDefaultButtons="False">
 2             <Items>
 3                 <dx:ReportToolbarButton ItemKind="Search" />
 4                 <dx:ReportToolbarSeparator />
 5                 <dx:ReportToolbarButton ItemKind="PrintReport" />
 6                 <dx:ReportToolbarButton ItemKind="PrintPage" />
 7                 <dx:ReportToolbarSeparator />
 8                 <dx:ReportToolbarButton Enabled="False" ItemKind="FirstPage" />
 9                 <dx:ReportToolbarButton Enabled="False" ItemKind="PreviousPage" />
10                 <dx:ReportToolbarLabel ItemKind="PageLabel" />
11                 <dx:ReportToolbarComboBox ItemKind="PageNumber" Width="65px">
12                 </dx:ReportToolbarComboBox>
13                 <dx:ReportToolbarLabel ItemKind="OfLabel" />
14                 <dx:ReportToolbarTextBox IsReadOnly="True" ItemKind="PageCount" />
15                 <dx:ReportToolbarButton ItemKind="NextPage" />
16                 <dx:ReportToolbarButton ItemKind="LastPage" />
17                 <dx:ReportToolbarSeparator />
18                 <dx:ReportToolbarButton ItemKind="SaveToDisk" />
19                 <dx:ReportToolbarButton ItemKind="SaveToWindow" />
20                 <dx:ReportToolbarComboBox ItemKind="SaveFormat" Width="70px">
21                     <elements>
22                         <dx:ListElement Value="pdf" />
23                         <dx:ListElement Value="xls" />
24                         <dx:ListElement Value="xlsx" />
25                         <dx:ListElement Value="rtf" />
26                         <dx:ListElement Value="mht" />
27                         <dx:ListElement Value="html" />
28                         <dx:ListElement Value="txt" />
29                         <dx:ListElement Value="csv" />
30                         <dx:ListElement Value="png" />
31                     </elements>
32                 </dx:ReportToolbarComboBox>
33             </Items>
34             <styles>
35                 <LabelStyle><Margins MarginLeft='3px' MarginRight='3px' /></LabelStyle>
36             </styles>
37         </dx:ReportToolbar>
38         <br />
39         <dx:ReportViewer ID="ReportViewer1" runat="server">
40         </dx:ReportViewer>

前台代码(重要

View Code
 1 protected void Page_Load(object sender, EventArgs e)
 2         {
 3             DataTable dt = new Controller().GetData();
 4             List<Dept> list = new List<Dept>();
 5             Dept deptInfo = null;
 6 
 7             for (int i = 0; i < dt.Rows.Count; i++)
 8             {
 9                 deptInfo = new Dept()
10                 {
11                     ID = dt.Rows[i]["ID"].ToString(),
12                     Name = dt.Rows[i]["名称"].ToString()
13                  
14                 };
15                 if (dt.Rows[i]["添加时间"] == null)
16                     deptInfo.CreateTime = null;
17                 else
18                     deptInfo.CreateTime = Convert.ToDateTime(dt.Rows[i]["添加时间"]);
19                 list.Add(deptInfo);
20             }
21 
22             XtraReport xpr = null;
23             if (dt != null)
24             {
25                 xpr = XtraReport.FromFile(Server.MapPath("~") + "dept.repx", true);
26                 xpr.DataSource = list;
27             }
28             xpr.CreateDocument();
29             ReportViewer1.Report = xpr;
30             ReportViewer1.DataBind();
31         }

这里要说的是:由于使用的List<>,所以在设计报表的时候,报表参数名称要和实体对象中的属性名称相一致。

对于奇偶行样式,可通过EvenStyle和OddStyle来设计实现。

2、主从表

报表设计

对于主从表的报表设计,建议使用Group和DetailReport来实现。

网页运行效果

数据层

View Code
 1 public DataSet GetMasterDetailData()
 2         {
 3             using (SqlConnection conn = new SqlConnection(connectionString))
 4             {
 5                 string _masterCommandSql = "SELECT [ID],[名称],[添加时间] FROM [部门表]";
 6                 string _detailCommandSql = "SELECT [编号],[姓名],[添加时间],[部门ID] FROM [用户表]";
 7                 DataSet ds = new DataSet();
 8                 using (SqlDataAdapter da = new SqlDataAdapter(_masterCommandSql, conn))
 9                 {
10                     da.Fill(ds,"Master");
11                 }
12                 using (SqlDataAdapter da = new SqlDataAdapter(_detailCommandSql, conn))
13                 {
14                     da.Fill(ds,"Detail");
15                 }
16                 return ds;
17             }
18         }

前台页面

View Code
<dx:ReportToolbar ID="ReportToolbar1" runat="server" ShowDefaultButtons="False" ReportViewerID="ReportViewer1">
            <Items>
                <dx:ReportToolbarButton ItemKind="Search" />
                <dx:ReportToolbarSeparator />
                <dx:ReportToolbarButton ItemKind="PrintReport" />
                <dx:ReportToolbarButton ItemKind="PrintPage" />
                <dx:ReportToolbarSeparator />
                <dx:ReportToolbarButton Enabled="False" ItemKind="FirstPage" />
                <dx:ReportToolbarButton Enabled="False" ItemKind="PreviousPage" />
                <dx:ReportToolbarLabel ItemKind="PageLabel" />
                <dx:ReportToolbarComboBox ItemKind="PageNumber" Width="65px">
                </dx:ReportToolbarComboBox>
                <dx:ReportToolbarLabel ItemKind="OfLabel" />
                <dx:ReportToolbarTextBox IsReadOnly="True" ItemKind="PageCount" />
                <dx:ReportToolbarButton ItemKind="NextPage" />
                <dx:ReportToolbarButton ItemKind="LastPage" />
                <dx:ReportToolbarSeparator />
                <dx:ReportToolbarButton ItemKind="SaveToDisk" />
                <dx:ReportToolbarButton ItemKind="SaveToWindow" />
                <dx:ReportToolbarComboBox ItemKind="SaveFormat" Width="70px">
                    <elements>
                        <dx:ListElement Value="pdf" />
                        <dx:ListElement Value="xls" />
                        <dx:ListElement Value="xlsx" />
                        <dx:ListElement Value="rtf" />
                        <dx:ListElement Value="mht" />
                        <dx:ListElement Value="html" />
                        <dx:ListElement Value="txt" />
                        <dx:ListElement Value="csv" />
                        <dx:ListElement Value="png" />
                    </elements>
                </dx:ReportToolbarComboBox>
            </Items>
            <styles>
                <LabelStyle><Margins MarginLeft='3px' MarginRight='3px' /></LabelStyle>
            </styles>
        </dx:ReportToolbar>
        <dx:ReportViewer ID="ReportViewer1" runat="server">
        </dx:ReportViewer>

前台代码

View Code
 1 protected void Page_Load(object sender, EventArgs e)
 2         {
 3             DataSet ds=new Controller().GetMasterDetailData();
 4 
 5             DataColumn masterColumn=ds.Tables["Master"].Columns["ID"];
 6             DataColumn detailColumn=ds.Tables["Detail"].Columns["部门ID"];
 7 
 8             DataRelation relation = new DataRelation("relation1",masterColumn,detailColumn);
 9             ds.Relations.Add(relation);
10 
11             XtraReport xpr = XtraReport.FromFile(Server.MapPath("~") + "dept_and_users.repx", true);
12 
13             GroupField gf = new GroupField("ID", XRColumnSortOrder.Ascending);
14             ((GroupHeaderBand)(xpr.FindControl("GroupHeader1", true))).GroupFields.Add(gf);
15 
16             xpr.DataMember = "Master";
17             xpr.DataSource = ds;
18 
19             
20 
21             ((DetailBand)(xpr.FindControl("Detail1", true))).Report.DataMember = "relation1";
22             ((DetailBand)(xpr.FindControl("Detail1", true))).Report.DataSource = ds;
23             
24             //xpr.FindControl("tableCell10", true).DataBindings.Add("Text", ds, "relation1.编号");
25             //xpr.FindControl("tableCell11", true).DataBindings.Add("Text", ds, "relation1.姓名");
26             //xpr.FindControl("tableCell12", true).DataBindings.Add("Text", ds, "relation1.添加时间");
27 
28             XRTableCellCollection cc = ((XRTable)(xpr.FindControl("table4", true))).Rows[0].Cells;
29             BindingFields(ds,cc,"relation.");
30             xpr.CreateDocument();
31             ReportViewer1.Report = xpr;
32             ReportViewer1.DataBind();
33         }
34 
35         private void BindingFields(DataSet ds, XRTableCellCollection cc,string relationName)
36         {
37             for (int i = 0; i < ds.Tables["Detail"].Columns.Count-1; i++)
38             {
39                 cc[i].DataBindings.Add("Text", ds, relationName + ds.Tables["Detail"].Columns[i].Caption);
40             }
41         }

这里需要注意的几点,这几点都是必需的:1、设定dataset中表与表之间的关系

1 DataColumn masterColumn=ds.Tables["Master"].Columns["ID"];
2 DataColumn detailColumn=ds.Tables["Detail"].Columns["部门ID"];
3 
4 DataRelation relation = new DataRelation("relation1",masterColumn,detailColumn);
5 ds.Relations.Add(relation);

2、设定groupheader的分组依据字段

1 GroupField gf = new GroupField("ID", XRColumnSortOrder.Ascending);
2 ((GroupHeaderBand)(xpr.FindControl("GroupHeader1", true))).GroupFields.Add(gf);

3、成员绑定

1 xpr.DataMember = "Master";
2 xpr.DataSource = ds;
3 ((DetailBand)(xpr.FindControl("Detail1", true))).Report.DataMember = "relation1";
4 ((DetailBand)(xpr.FindControl("Detail1", true))).Report.DataSource = ds;

对于从表的数据绑定,都需要使用DataBindings属性,所以,下面的代码要这样写:

1 XRTableCellCollection cc = ((XRTable)(xpr.FindControl("table4", true))).Rows[0].Cells;
2 BindingFields(ds,cc,"relation.");
1 private void BindingFields(DataSet ds, XRTableCellCollection cc,string relationName)
2         {
3             for (int i = 0; i < ds.Tables["Detail"].Columns.Count-1; i++)
4             {
5                 cc[i].DataBindings.Add("Text", ds, relationName + ds.Tables["Detail"].Columns[i].Caption);
6             }
7         }

上面就是从报表设计器设计报表,从代码中调用报表的全部内容。当然还有直接在VS当中创建报表,这种方式和上面的操作大同小异,而且网上的代码也很多,这里就不再介绍了。还有一种方式就是运行时创建报表,这样的好处是,在报表表头、表尾大体相同的情况下,可以省下很大一部分时间。园子里这样的文章不少,也不乏写的好的,大家都找找吧。

posted @ 2012-12-20 10:45  禁止吸烟  阅读(8142)  评论(2编辑  收藏  举报