• 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当中创建报表,这种方式和上面的操作大同小异,而且网上的代码也很多,这里就不再介绍了。还有一种方式就是运行时创建报表,这样的好处是,在报表表头、表尾大体相同的情况下,可以省下很大一部分时间。园子里这样的文章不少,也不乏写的好的,大家都找找吧。




    文章作者:禁止吸烟

    道本无话可说,皆当全力以赴。

    博客地址:http://www.cnblogs.com/outtamyhead/

  • 相关阅读:
    jQuery attr 与 prop 区别最简单分析
    Js事件处理模型/周期
    canvas实现点击带水纹的按钮
    js作用域问题
    js 函数里的 this
    css3: scrollLeft,scrollWidth,clientWidth,offsetWidth 的区别
    C# 中的Async 和 Await 的用法详解
    1、Task的优势
    探秘C#中的yield关键字
    详解C#中 Thread,Task,Async/Await,IAsyncResult的那些事儿
  • 原文地址:https://www.cnblogs.com/outtamyhead/p/2826020.html
Copyright © 2020-2023  润新知