XtraReport应用(1)(XtraReport From File)
最近在研究dev xtraReport的应用,虽然从08年就开始接触dev,但是它的报表还是头次接触。在网上找了很多资料,但看来看去无非就那么两篇,呵呵,真是天下文章一大抄!相对水晶报表,xtraReport在设计上是很强大的,在功能上也要比水晶报表完善很多。但是在这里要吐槽一下,dev的demo写的真的不咋地,效果是出来了,找代码还得找半天还不应定能找到。
言归正传,今天主要说的单表显现和简单主从表显现实现。相对于国外报表来讲,国内的报表很有中国特色,中规中矩的,所以也给设计人员带来了些许方便。先来说说单表的报表实现。我在这里使用的是xtraReport的设计器来设计的报表,有兴趣的可以从demo-xtraReports-RibbonReportDesigner打开它。在设计上,和水晶报表的设计有不同,但是参数的标识也是用"[]"的。
1、单表
报表设计
网页运行效果
后台代码(Ps:数据库不是我的,大家不要喷我~~)
数据层
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
实体类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 public class Dept 2 { 3 public string ID{get;set;} 4 public string Name { get; set; } 5 public DateTime? CreateTime { get; set; } 6 }
前台页面
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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>
前台代码(重要)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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来实现。
网页运行效果
数据层
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }
前台页面
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<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>
前台代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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当中创建报表,这种方式和上面的操作大同小异,而且网上的代码也很多,这里就不再介绍了。还有一种方式就是运行时创建报表,这样的好处是,在报表表头、表尾大体相同的情况下,可以省下很大一部分时间。园子里这样的文章不少,也不乏写的好的,大家都找找吧。