威尼斯人线上娱乐

字符串转为实体类,常用效用总汇

7 4月 , 2019  

干活中有这般三个急需,有N张不一样的报表,每张报表对应2个数据源,总括数据选取内存格局,首先在内在里定义了数据源对应实体。总结口径用lamdba表明式式达成,通过工具对单元格进行定义。在落到实处进程中针对每一张表来写取数字展现示是很Low的了,取数条件定义都以规则的,总括完毕就是一段C#代码,可是要对准不相同的数据源也正是分裂的List<Entity>,通过商讨发现经过泛型和反光能够达成。

1.常用控件

威尼斯人线上娱乐 1文本框:输入文字或表明式

威尼斯人线上娱乐 2报表:设置表格的队列数,输入数字或表明式

威尼斯人线上娱乐 3子报表:放置子报表后,系统会活动增添一个页面,你能够在此页面上设计须求的报表。系统在打印处理时,先按主报表打字与印刷,当遭逢子报表时会自动转入子报表的页面进行打字与印刷处理,完结后一而再执行主报表打字与印刷的行事,所以大家又叫做嵌套报表。

威尼斯人线上娱乐 4复选框:依照布尔表达式是或不是为ture来显示是或不是 √

威尼斯人线上娱乐 5条形码:绑定扫描码,1般Type为Code128

威尼斯人线上娱乐 6交叉表:Matrix

威尼斯人线上娱乐 7页面设置:设置纸张大小及页边距

威尼斯人线上娱乐 8边框设置:设置是不是出示上下左右侧框以及边框线条的设置

威尼斯人线上娱乐 9字符串转为实体类,常用效用总汇。边框宽度:下拉三角能够采纳边框宽度设置

非类型化的基准查询

咱俩从概念规则查询的根初步,代码如下所示:

var query = session.CreateCriteria<Product>();

CreateCriteria方法再次来到一个完结了ICriteria接口的靶子。如果获得具有成品的列表,那么大家必要动用接口ICriteria的List<T>方法,如上面包车型大巴代码所示:

var products = session.CreateCriteria<Product>().List<Product>();

List<Product>()方法重返IList<Product>。和LINQ to
NHibernate相比较,当List方法被调用时查询即刻施行。

理所当然还有3个非泛型的List高卢雄鸡法定义在ICriteria接口上。那几个方法重回一个IList类型的靶子。

1.常用控件

 

   
  威尼斯人线上娱乐 10文本框:输入文字或表明式

   
  威尼斯人线上娱乐 11报表:设置表格的类别数,输入数字或表达式

     
威尼斯人线上娱乐 12子报表:放置子报表后,系统会活动扩展贰个页面,你能够在此页面上规划必要的报表。系统在打字与印刷处理时,先按主报表打字与印刷,当蒙受子报表时会自动转入子报表的页面进
     
行打字与印刷处理,达成后持续执行主报表打字与印刷的工作,所以我们又叫做嵌套报表。

   
  威尼斯人线上娱乐 13复选框:依照布尔表明式是或不是为ture来显示是或不是 √(如性别男女)

   
  威尼斯人线上娱乐 14条形码:绑定扫描码(如静滴单),一般Type为Code128 

           
  威尼斯人线上娱乐 15交叉表:Matrix

     
     
  威尼斯人线上娱乐 16页面设置:设置纸张大小及页边距

     
     
  威尼斯人线上娱乐 17边框设置:设置是不是出示上下左左边框以及边框线条的设置

     
     
  威尼斯人线上娱乐 18边框宽度:下拉三角能够采用边框宽度设置

 

基于字符串获取实体类型

二.常用报表栏

报表标题区(ReportTitle):仅在第3页彰显在纸张的上部。1般用于打字与印刷表格的标题等音信。

报表合计(ReprotSummary):仅展现在富有数据的最后末尾。壹般用来打字与印刷总计音信等。

页眉(PageHeader):突显在每页的最上部。通过安装你能够让它放到报表抬头之上可能之下。1般用来打字与印刷页眉音讯等。

数据区:绑定数据源展现数据。

数码首:显示在颇具数据源的最上部,仅打字与印刷3次。一般用于呈现相关摘要消息,与页眉的界别是当该页无数据时,数据首的始末不出示且仅显示叁次。

数据尾:显示在有着数据源的最上面,仅打字与印刷3次。一般用来体现全部数据的商业事务新闻。

栏首(ColumnHeader):展现在每页数据源的上部,它在每页均呈现。因而一般用于打字与印刷数据源字段的栏目消息。

栏尾(ColumnHeader):呈现在每页数据源的上边,它在每页均显得。一般可用以总结展现每页数据的页合计消息。

分组页眉(GroupHeader):用于显示分组数据,在每1个分组开首显得。

分组页脚(GroupFooter):与群组首11对应。壹般用来呈现分组数据的总括信息。

页脚(PageFooter):展现在每页的最终面部分。壹般用来打字与印刷页序等新闻。

限定再次回到的记录数

限制查询重返的记录数,能够行使Set马克斯Results方法。从数据库中拿走前13个产品,代码如下:

var first10Products = session.CreateCriteria<Product>()
                       .SetMaxResults(10)
                       .List<Product>();

2.常用报表栏

      

报表标题区(ReportTitle):仅在第3页展现在纸张的上部。一般用于打印表格的标题等新闻。

 

报表合计(ReprotSummary):仅展现在全部数据的末尾末尾。1般用来打印计算信息等。

 

页眉(PageHeader):显示在每页的最上部。通过设置你能够让它放到报表抬头之上或然之下。壹般用来打字与印刷页眉新闻等。

 

数据区(data):绑定数据源突显数据。

 

数码首(Header):展现在具备数据源的最上部,仅打字与印刷三遍。一般用于体现相关摘要消息,与页眉的界别是当该页无数据时,数据首的始末不出示且仅体现三回。

 

数据尾(Footer):显示在享有数据源的最下边,仅打印1次。1般用来体现所有数据的协议音信。

 

栏首(ColumnHeader):显示在每页数据源的上部,它在每页均彰显。由此一般用来打字与印刷数据源字段的栏目信息。

 

栏尾(ColumnHeader):展现在每页数据源的底下,它在每页均显得。一般可用于总计展现每页数据的页合计音信。

 

分组页眉(GroupHeader):用于突显分组数据,在每1个分组开头显得。

 

分组页脚(GroupFooter):与群组首1一对应。壹般用来展示分组数据的总结音信。

 

页脚(PageFooter):彰显在每页的最尾巴部分。1般用来打印页序等新闻。

 

 1 private Type getEntity(string typeName)
 2 {
 3     var workPath = AppDomain.CurrentDomain.BaseDirectory;
 4     string[] files = Directory.GetFiles(workPath, "XXX.Utils.dll", SearchOption.TopDirectoryOnly);
 5     foreach (string file in files)
 6     {
 7         string ext = file.Substring(file.LastIndexOf("."));
 8         if (ext != ".dll") continue;
 9         try
10         {
11             Assembly asm = Assembly.LoadFile(file);
12             Type[] allTypes = asm.GetTypes();
13             foreach (Type t in allTypes)
14             {
15                 if (t.IsSubclassOf(typeof(XXDataRecord)))
16                 {
17                     if (t.Name.ToUpper().IsSame(typeName.ToUpper()))
18                         return t;
19                 }
20             }
21         }
22         catch
23         {
24             return null;
25         }
26     }
27     return null;
28 }

叁.常用作用

筛选记录集

假设筛选出下架的出品,代码如下所示:

var discontinuedProducts = session.CreateCriteria<Product>()
                           .Add(Restrictions.Eq("Discontinued", true))
                           .List<Product>();

通过给查询添加1个或四个限制条件筛选就到位了。借使大家想赢得全数须求再预定的在架产品列表,大家得以选择上边包车型地铁代码:

var discontinuedProducts = session.CreateCriteria<Product>()
                           .Add(Restrictions.Eq("Discontinued", false))
                           .Add(Restrictions.GeProperty("ReorderLevel", "UnitsOnStock"))
                           .List<Product>();

固然那样很灵巧,然而和LINQ to
NHibernate比较也是11分简单出错的。假如把UnitsOnStock写成了UnitSonStock,只有在运作时才会发觉到那么些错误。

别的,Restrictions那几个静态类还有很多概念筛选标准的福利的主意。

叁.常用成效

 

 

一.添加报表栏

将光标置于“设置报表拦”弹出“段编辑器”,再接纳丰硕或删除段。

添加段的时候要专注:

一)选拔添加段的岗位,如想添加子数据区,则当选要添加父数据区,点击添加“数据区”即可,如图所示:

威尼斯人线上娱乐 19威尼斯人线上娱乐 20威尼斯人线上娱乐 21

2)若加上的数据区与原数据区平级,任选段,点击添加“数据区”即可,如图所示:

威尼斯人线上娱乐 22威尼斯人线上娱乐 23威尼斯人线上娱乐 24

辉映记录集

今昔让我们研讨怎样映射记录集。那也号称投影。使用Criteria
API未有利用LINQ方便,大家亟须首先定义想要投影的字段。然后,还要定义贰个transformer,它将那一个值放入到所需的对象项目中,如下边包车型客车代码所示:

var productsLookup = session.CreateCriteria<Product>()
                    .SetProjection(Projections.ProjectionList()
                    .Add(Projections.Property("Id"))
                    .Add(Projections.Property("Name"))
                    )
                    .SetResultTransformer(
                    new AliasToBeanResultTransformer(typeof(NameID)))
                    .List<NameID>();

在地方的代码中,大家选择SetProjection方法定义映射。大家挑选product的Id和Name属性,并将它们放入到NameID类型的目的中。类NameID定义如下:

public class NameID
{
    public int Id { get; set; }
    public string Name { get; set; }
}

咱俩使用AliasToBeanResultTransformer把询问结果转换为NameID对象的列表。注意目的对象的品质名称必须与投影属性的名号匹配。假使不合作,ProjectionList有一个Add的重载方法,大家得以定义贰个小名。那个外号与对象对象的称呼相相配。

1.添加报表栏

 

将光标置于“设置报表拦”弹出“段编辑器”,再选取丰盛或删除段。

 

添加段的时候要留意:

 

     壹)选取添加段的职位,如想添加子数据区,则当选要添加父数据区,点击添加“数据区”即可,如图所示:

                 
 威尼斯人线上娱乐 25威尼斯人线上娱乐 26威尼斯人线上娱乐 27

       

       2)若加上的数据区与原数据区平级,任选段(除数量区外),点击添加“数据区”即可,如图所示:

                 
 威尼斯人线上娱乐 28威尼斯人线上娱乐 29威尼斯人线上娱乐 30

         

泛型方法定义

二.添加数据源

选料菜单栏的“数据”,在下拉框中当选“选取数据源”,弹出“选拔报表数量”框,里面会列出已经流传的数据源,勾选供给的数据源,点击鲜明,此时界面右侧“数据”列表中即体现当前所选中的数据源,选中数据源,右键选拔“查看数据”,即可呈现当前数据源中所含有的数码:

威尼斯人线上娱乐 31威尼斯人线上娱乐 32威尼斯人线上娱乐 33

威尼斯人线上娱乐 34威尼斯人线上娱乐 35

排序结果集

排序结果集卓殊简单。我们只需加上其余3个原则,如上面包车型地铁代码所示:

var sortedProducts = session.CreateCriteria<Product>()
                    .AddOrder(Order.Asc("Name"))
                    .List<Product>();

以相反的顺序排列产品列表,只需利用Order类的Desc方法。我们还是能依据几本性格排序,只需为各个字段添加1个排序条件即可。

二.添加数据源

 

选料菜单栏的“数据”,在下拉框中当选“选用数据源”,弹出“采取报表数量”框,里面会列出已经流传的数据源,勾选要求的数据源,点击鲜明,此时界面右侧“数据”列表中即显示当前所选中的数据源,选中数据源,右键选拔“查看数据”,即可展现当前数据源中所含有的数据:

               
  威尼斯人线上娱乐 36威尼斯人线上娱乐 37威尼斯人线上娱乐 38

               
 威尼斯人线上娱乐 39威尼斯人线上娱乐 40

 

1 public XXDataMemory BuildDataMemoryPattern<T>(XXParams zb, string id) where T : XXDataRecord, new()

三.添加类别变量

对于部分变量也许取自当前系统,如时间,页码,序号等,此时甄选系统变量中相应的变量即可,如图:

威尼斯人线上娱乐 41

分组记录集

分组在LINQ提供程序中是独立的章程,不过在criteria
API中是影子的壹局地。要是我们想依照Category分组产品和计算每种类别的产品数,大家得以行使下边包车型大巴询问:

var productsGrouped = session.CreateCriteria<Product>()
                     .SetProjection(Projections.ProjectionList()
                     .Add(Projections.GroupProperty("Category"))
                     .Add(Projections.RowCount(), "Num")
                     )
                    .List();

即使非得依照用户的挑3拣4动态变化查询,criteria
API是最合适的。除却,LINQ to
NHibernate更拥有可读性以及从长时间来看更有可维护性。

叁.添加种类变量

对此有个别变量恐怕取自当前系统,如时间,页码,序号等,此时选用系统变量中相应的变量即可,如图:

                                                             
 威尼斯人线上娱乐 42

 

4.添加集中

对于有些报表,要求在多少尾添加合计行,此时亟待手动添加合计,弹出汇总项编辑器,再在集中项编辑器中添加汇总数据源。

威尼斯人线上娱乐 43

在集聚名称壹栏能够自命名二个商事名称;

威尼斯人线上娱乐 44

在“数据列或公式”中得以采用集中的数据源;

在“总结段中每1列”能够选取加入汇总的数据区;

在“总括满意上面条件的行”中得以做过滤,在写total时会出现计量某体系型的和,比如总计总人次分在职和离休之和,此时在写total时就须求写限制标准实行过滤。如[Table1.GRXZ]==”1″;如图:

威尼斯人线上娱乐 45

强类型的尺度查询

NHibernatet
3引进了一个新的成效就是能够应用强类型定义规则查询。为此,QueryOver<T>加入到了ISession接口中。那里,泛型参数T表示我们想询问的实业类型。

动用QueryOver API,大家钦点询问的根,如上边包车型客车代码所示:

var query = session.QueryOver<Product>();

不难易行的获取具有产品的列表,使用如下所示的查询:

var products = session.QueryOver<Product>().List();

与Criteria API相比较,QueryOver不供给内定再次来到类型。

④.添加集聚

对此壹些表格,须要在数码尾添加合计行,此时亟需手动添加合计,弹出汇总项编辑器,再在汇集项编辑器中添加汇总数据源。

                                     
  威尼斯人线上娱乐 46

在集中名称1栏可以自命名3个共谋名称;

                                       
 威尼斯人线上娱乐 47

在“数据列或公式”中得以采用集中的数据源;

在“总结段中每一列”能够选择加入汇总的数据区;

在“总计满意上面条件的行”中能够做过滤,在写total时会出现计量某体系型的和,比如计算总人次分在职和离退休之和,此时在写total时就要求写限制标准进行过滤。如[Table1.GRXZ]==”1″;如图:

                                                       
 威尼斯人线上娱乐 48

调用方法代码

⑤.添加过滤、排序、分组

双击数据区,弹出“编辑数据段”,能够拓展数据源的选料、排序、过滤。如图:

威尼斯人线上娱乐 49

范围重返的记录数

限制查询重返的记录数,大家得以应用Take方法。那几个查询和LINQ to
NHibernate的查询相似,如上边所示:

var first10Products = session.QueryOver<Product>()
                      .Take(10)
                      .List();

5.添加过滤、排序、分组

双击数据区,弹出“编辑数据段”,能够拓展数据源的接纳、排序、过滤。如图:

                                         
 威尼斯人线上娱乐 50

 

 1 var obj = new GenerateDataHelper(_Param);
 2 Type myGenericClassType = obj.GetType();
 3 //MakeGenericMethod 设置泛型参数类型
 4 MethodInfo mi = myGenericClassType.GetMethod("BuildDataMemoryPattern").MakeGenericMethod(typeEntity);
 5 int count = 0;
 6 //设置调用方法参数
 7 object[] invokeArgs = new object[] { zb, id, count };
 8 //调用
 9 var dt = (DataTable)mi.Invoke(obj, invokeArgs);
10 //获取回返数据
11 recordCount = (int)invokeArgs[9];

4.常用属性

筛选记录集

威尼斯人线上娱乐 ,筛选记录集使用Where方法。获得全数下架产品的列表,使用下边包车型地铁代码:

var discontinuedProducts = session.QueryOver<Product>()
                           .Where(p => p.Discontinued)
                           .List();

自然,大家还足以组成八个筛选,例如,获取具有在架上且需求重新订购的制品列表,如下边包车型大巴代码所示:

var productsToReorder = session.QueryOver<Product>()
                        .Where(p => p.Discontinued == false)
                        .Where(p => p.ReorderLevel >= p.UnitsOnStock)
                        .List();

笔者们还是可以动用上边包车型客车办法筛选:

var productsToReorder = session.QueryOver<Product>()
                        .Where(p => p.Discontinued == false &&p.ReorderLevel >= p.UnitsOnStock)
                        .List();

肆.常用属性

 

一.页面设置

用以突显总的页数(TotalPages),例如:页脚突显第3页/共20页。系统第3遍扫描报表时总计出TotalPages,然后第3遍实际变化报表。要是不利用Doublepass,则TotalPages重回0,所以必须设置report的性质doublepass为true;

安装方法:点击报表树,单击报表树最顶端图标,点击属性,选拔doublepass为true;也可直接在属性框中精选report,举办有关属性设置!如图:

威尼斯人线上娱乐 51威尼斯人线上娱乐 52

排序结果集

动用QueryOver
API排序和LINQ相当相像,只是LINQ定义OrderBy和OrderByDescending来定义升序和降序,而QueryOver
API只定义了多少个OrderBy方法。但是,这一个法子必须和Asc或许Desc组合使用。当依据八个字段排序时,那多少个API都有ThenBy(LINQ还有2个ThenByDescending)方法。

取得依据Name升序和UnitPrice降序排列的制品列表,代码如下所示:

var sortedProducts = session.QueryOver<Product>()
                    .OrderBy(p => p.Name).Asc
                    .ThenBy(p => p.UnitPrice).Desc
                    .List();

1.页面安装

用于体现总的页数(TotalPages),例如:页脚彰显 第贰页/共20页。系统率先遍扫描报表时总括出TotalPages,然后第1遍实际变化报表。假若不行使Double pass,则TotalPages重回0,所以必须设置report的习性doublepass为true;

设置方法:点击报表树,单击报表树最顶端图标,点击属性,选取doublepass为true;也可直接在属性框中选择report,举办有关属性设置!如图:

                                       
  威尼斯人线上娱乐 53威尼斯人线上娱乐 54

下边是壹体代码,具体效果达成略过

二.打印设置

对于套打模板,样式在纸张上曾经稳定了(如处方笺、收取金钱发票),只必要遵守原定的样书将数据填充进去,在绘制的时候,必要用尺子卓绝尺寸,为了能够有1个越来越好的效果,一般把页面春日经存在不要求再打印出来的也画出来,可是急需设置属性“printable”为false:表示打字与印刷不出示,若想在预览的时候就绝不看到这么些不必要打字与印刷的,则需安装属性“Visible”为false:表示预览不显得。

阴影结果集

运用QueryOver
API定义映射也是最难的1有的。如若只想寻找全体产品的Id和Name,并将它们填充到NameID对象的数组中,能够选取上边的代码完结:

var productsLookup = session.QueryOver<Product>()
                    .Select(p => p.Id, p => p.Name)
                    .TransformUsing(Transformers.AliasToBean<NameID>())
                    .List<NameID>();

只顾我们是怎样运用Select方法定义大家想投影的属性列表。每种属性都由二个拉姆达表达式定义,例如p=>p.Name投影Name属性。然后,大家使用TransformUsing方法评释NHibernate怎么着转移投影结果。在眼前的例子中大家接纳AliasToBean转换器申明NameID作为靶子转移类型。NHibernate还定义了别样的转换器,甚至足以定义本人的转换器。静态类Transformers给出了大家可用转换器的列表。最终调用List<NameID>截止。那里大家声解表标项目,不然,NHibernate会认为指标项目如故是Product。

二.打字与印刷设置

对此套打模板,样式在纸张上业已定位了(如处方笺、收取金钱发票),只必要根据原定的范本将数据填充进去,在绘制的时候,必要用尺子特出尺寸,为了能够有三个越来越好的功力,1般把页面上业已存在不须要再打印出来的也画出来,可是急需设置属性“printable”为false:表示打字与印刷不彰显,若想在预览的时候就不用看到那一个不须要打字与印刷的,则需安装属性“Visible”为false:表示预览不出示。

威尼斯人线上娱乐 55威尼斯人线上娱乐 56

3.格式设置

报表中壹些数据要求遵照规定的格式去显得,如必要把时间的格式改变一下,选中当前数码,右键单击,点击format(或在属性栏中挑选format),在弹出的取舍格式框中精选须要的格式。若format中尚无索要的格式,则要求在custom中自定义,比如笔者索要把日子设置为二零一三-0九-0911:22:2三,此时能够在custom中填时间展现格式:yyyy-MM-ddHH:mm:ss。注意有的必要显示午夜依旧午夜,表示深夜午后的格式是tt,具体有关安装能够参见已存在的format实行编写制定!如图:

威尼斯人线上娱乐 57威尼斯人线上娱乐 58

分组记录集

当大家利用投影转换数据时,还足以分组记录集以及给字段应用聚合函数。根据Category分组全部的产品,然后总括每种种类下产品的个数,还足以测算每一个门类下的平分单价以及各类项目下的仓库储存量总和。如上边包车型大巴代码所示:

var productsGrouped = session.QueryOver<Product>()
                    .Select(Projections.Group<Product>(p => p.Category),
                            Projections.Avg<Product>(p => p.UnitPrice),
                            Projections.Sum<Product>(p => p.UnitsOnStock),
                            Projections.RowCount())
                    .List<object[]>();

为了不难,上边的代码中大家从没概念转换,只是让NHibernate重临结果集的行数。

叁.格式设置

报表中部分数据须要根据明确的格式去呈现,如须要把日子的格式改变一下,选中当前数据,右键单击,点击format(或在属性栏中甄选format),在弹出的挑叁拣肆格式框中选取须要的格式。若format中绝非索要的格式,则须求在custom中自定义,比如自个儿急需把时间设置为贰零一三-0九-0玖 1一:22:贰3,此时能够在custom中填时间展现格式:yyyy-MM-dd HH:mm:ss。注意有的要求出示下午要么午夜,表示深夜早上的格式是tt,具体有关设置可以参照已存在的format进行编辑!如图:

                                               
  威尼斯人线上娱乐 59威尼斯人线上娱乐 60

              

 1 public class UtilFetchHelper 
 2 {
 3     //获取实体类型
 4     private Type getEntity(string typeName)
 5     {
 6         var workPath = AppDomain.CurrentDomain.BaseDirectory;
 7         string[] files = Directory.GetFiles(workPath, "XXX.Utils.dll", SearchOption.TopDirectoryOnly);
 8         foreach (string file in files)
 9         {
10             string ext = file.Substring(file.LastIndexOf("."));
11             if (ext != ".dll") continue;
12             try
13             {
14                 Assembly asm = Assembly.LoadFile(file);
15                 Type[] allTypes = asm.GetTypes();
16                 foreach (Type t in allTypes)
17                 {
18                     if (t.IsSubclassOf(typeof(XXDataRecord)))
19                     {
20                         if (t.Name.ToUpper().IsSame(typeName.ToUpper()))
21                             return t;
22                     }
23                 }
24             }
25             catch
26             {
27                 return null;
28             }
29         }
30         return null;
31     }
32 
33     public DataTable BuildDataMemoryPattern(XXParams zb, string id, out int recordCount)
34     {
35         //根据传入参数获取实体名称
36         var entityName = GetDataSourceEntityName(zb);
37         //获取实体类型
38         Type typeEntity = getEntity(entityName);
39         if (typeEntity == null)
40             return  null;
41         var obj = new GenerateDataHelper(_Param);
42         Type myGenericClassType = obj.GetType();
43         MethodInfo mi = myGenericClassType.GetMethod("BuildDataMemoryPattern").MakeGenericMethod(typeEntity);
44         int count = 0;
45         object[] invokeArgs = new object[] { zb, id, count };
46         var dt = (DataTable)mi.Invoke(obj, invokeArgs);
47         //这里获取回返数据
48         recordCount = (int)invokeArgs[9];
49         return dt;
50     }
51 }
52 
53 public class GenerateDataHelper
54 {
55     private List<XXDataRecord> _DataList;
56     private List<XXDataRecord> DataList
57     {
58         set { _DataList = value; }
59         get { return _DataList; }
60     }    
61     
62     private List<T> GetDataSource<T>() where T : XXDataRecord, new()
63     {
64         var _DataList = new List<T>();
65         var dt = DB.ExecuteDataTable("Select * From XX");
66         for (int i = 0; i < dt.Rows.Count; i++)
67         {
68             var dataEnt = new T();
69             for (int j = 0; j < dt.Columns.Count; j++)
70             {
71                 dataEnt[dt.Columns[j].ColumnName] = dt.Rows[i][j];
72             }
73             _DataList.Add(dataEnt);
74         }
75         return _DataList;        
76      }
77         
78         
79     public XXDataMemory BuildDataMemoryPattern<T>(XXParams zb, string id) where T : XXDataRecord, new()
80     {
81         List<T> DataList = new List<T>();
82         DataList = GetDataSource<T>();
83         //以下是具体实现代码 针对DataList查询操作
84     }
85 }

四.展现设置

对此有个别数据,名称较长,在行高固定的情形下,系统暗中认可为自动换行,此时双边均不能够一心展示无法一心呈现,比如,此时遵照客户的须求,若供给机关截断,则设置“WordWrap”为false,若供给任何出示,则要求让该多少有依照单元格大小活动缩放功效,设置属性“AutoShrink”为fontsize大概fontwith。

利用QueryOver检索数据

在这些例子中,我们添加壹些成品到数据库,然后使用QueryOver方法检索那一个产品。

而且,大家选用Loquacious配置和ConfOrm映射,就当复习后面包车型地铁剧情了。

ConfOrm映射在NHibernate初学者指南(6):映射模型到数据库之方式二

Loquacious配置在NHibernate初学者指南(1四):配置的两种方法

下边正式启幕大家的例子。

  1. 在SSMS中成立多个数据库:QueryOverSample。

  2. 在Visual Studio中创设三个控制台应用程序:QueryOverSample。

三.
为品种增加对NHibernate.dll,NHibernate.ByteCode.Castle.dll和ConfOrm.dll程序集的引用。

  1. 在品种中添加三个类公事Category.cs,添加如下代码定义Category实体:

    public class Category
    {

     public virtual Guid Id { get; set; }
     public virtual string Name { get; set; }
     public virtual string Description { get; set; }
    

    }

  2. 在项目中添加叁个类公事Product.cs,添加如下代码定义Product实体:

    public class Product
    {

     public virtual Guid Id { get; set; }
     public virtual string Name { get; set; }
     public virtual Category Category { get; set; }
     public virtual decimal UnitPrice { get; set; }
     public virtual bool Discontinued { get; set; }
     public virtual int ReorderLevel { get; set; }
     public virtual int UnitsOnStock { get; set; }
    

    }

六.
在Program类中,添加贰个静态方法使用Loquacious配置创建1个NHibernate的Configuration对象:

private static Configuration GetConfiguration()
{
    var cfg = new Configuration();
    cfg.SessionFactory()
    .Proxy
    .Through<ProxyFactoryFactory>()
    .Integrate
    .LogSqlInConsole()
    .Using<MsSql2008Dialect>()
    .Connected
    .Through<DriverConnectionProvider>()
    .By<SqlClientDriver>()
    .Using(new SqlConnectionStringBuilder
    {
        DataSource = @".",
        InitialCatalog = "QueryOverSample",
        IntegratedSecurity = true
    });
    return cfg;
}
  1. 在Program类中添加一个静态方法为实体定义映射,代码如下所示:

    private static void AddMappings(Configuration configuration)
    {

     var types = new[] { typeof(Category), typeof(Product) };
     var orm = new ObjectRelationalMapper();
     orm.TablePerClass(types);
     var mapper = new Mapper(orm);
     var hbmMappings = mapper.CompileMappingFor(types);
     configuration.AddDeserializedMapping(hbmMappings, "MyDomain");
    

    }

  2. 在Program类中添加贰个静态方法创设或再一次创制数据库架构,如下所示:

    private static void BuildSchema(Configuration configuration)
    {

     new SchemaExport(configuration).Execute(true, true, false);
    

    }

  3. 在Program中添加其余三个静态方法创设数量,如上边包车型大巴代码所示:

    private static void BuildSchema(Configuration configuration)
    {

     new SchemaExport(configuration).Execute(true, true, false);
    

    }

    private static void AddProductsAndCategories(ISessionFactory sessionFactory)
    {

     var categories = new List<Category>();
     var products = new List<Product>();
     var random = new Random((int)DateTime.Now.Ticks);
     for (var i = 1; i <= 5; i++)
     {
         var category = new Category
         {
             Name = string.Format("Category {0}", i)
         };
         categories.Add(category);
         var count = random.Next(10);
         for (var j = 1; j <= count; j++)
         {
             var product = new Product
             {
                 Name = string.Format("Product {0}", i * 10 + j),
                 Category = category,
                 UnitPrice = (decimal)random.NextDouble() * 10m,
                 Discontinued = random.Next(10) > 8,
                 UnitsOnStock = random.Next(100),
                 ReorderLevel = random.Next(20)
             };
             products.Add(product);
         }
     }
     using (var session = sessionFactory.OpenSession())
     using (var tx = session.BeginTransaction())
     {
         foreach (var category in categories)
         {
             session.Save(category);
             foreach (var product in products)
             {
                 session.Save(product);
             }
         }
         tx.Commit();
     }
    

    }

今后大家接纳ISession接口的QueryOver方法创造1些数据报表。

十.
创制一个静态方法,成立三个session和transaction,用来调用报表创造报表方法,如下所示:

private static void PrintReports(ISessionFactory sessionFactory)
{
    Console.WriteLine();
    Console.WriteLine("---------------------");
    Console.WriteLine("| Prining Reports |");
    Console.WriteLine("---------------------");
    using (var session = sessionFactory.OpenSession())
    using (var tx = session.BeginTransaction())
    {
        PrintListOfCategories(session);
        tx.Commit();
    }
}
  1. 笔者们要求贯彻PrintListOfCategories方法,代码如下:

    private static void PrintListOfCategories(ISession session)
    {

    Console.WriteLine("\r\nList of categories:\r\n");
    var categories = session.QueryOver<Category>()
    .OrderBy(c => c.Name).Asc
    .List();
    foreach (var category in categories)
    {
        Console.WriteLine("Category: {0}", category.Name);
    }
    

    }

  2. 在Program类中,创立贰个静态字段,如下所示:

    private static ISessionFactory sessionFactory;

一三.
在Main方法中添加如下代码,创设布局,添加映射,创造或另行创设数据库架构,创制session工厂,创造和存款和储蓄category和product实体,最后调用PrintReports方法,如下所示:

var configuration = GetConfiguration();
AddMappings(configuration);
BuildSchema(configuration);
sessionFactory = configuration.BuildSessionFactory();
AddProductsAndCategories(sessionFactory);
PrintReports(sessionFactory);
Console.Write("\r\n\nHit enter to exit:");
Console.ReadLine();
  1. 运作程序,结果如下图所示:

威尼斯人线上娱乐 61

壹5.
添加另二个报表方法,检索未有下架和急需重新订购的享有产品列表。产品列表应该先按category名称排序,再按product名称排序,代码如下所示:

private static void PrintProductsToReorder(ISession session)
{
    Console.WriteLine("\r\nList of products to reorder:\r\n");
    Product productAlias = null;
    Category categoryAlias = null;
    var products = session.QueryOver<Product>(() => productAlias)
    .JoinAlias(() => productAlias.Category, () => categoryAlias)
    .Where(() => productAlias.Discontinued == false)
    .Where(() => productAlias.ReorderLevel >= productAlias.UnitsOnStock)
    .OrderBy(() => categoryAlias.Name).Asc
    .ThenBy(() => productAlias.Name).Asc
    .List();
    Console.WriteLine();
    foreach (var product in products)
    {
        Console.WriteLine(
        "Category: {0}, Product: {1} (Units on stock: {2})",
        product.Category.Name, product.Name,
        product.UnitsOnStock);
    }
}
  1. 在PrintReports方法中调用PrintProductsToReorder方法。

  2. 双重运维程序,结果如下图所示:

威尼斯人线上娱乐 62

专注,由于选择的是随机生成的数字,结果会不均等,小编开端运维了四遍,上海体育场合中的矩形框中都未曾结果。

4.来得设置

对此有个别数据,名称较长,在行高固定的状态下,系统默许为自动换行,此时两者均不可能完全展现不能够完全展现,比如,此时遵循客户的必要,若要求机关截断,则设置“WordWrap”为false(即不自行换行),若供给全副出示,则供给让该多少有依据单元格大小活动缩放效能,设置属性“AutoShrink”为fontsize可能fontwith。

View Code

伍.边框设置

边框能够因此工具栏设置,此时设置边框是依照外界框的分寸来展现,上边框的设置也足以经过设置下划线,此时下面框的长度是依照数量展现的尺寸来决定,还足以设置属性“underline”为true,此时也是基于边框的高低来展示的。

总结

率先我们讲解了规范查询的二种艺术,即:非类型化的和强类型的。然后经过3个粗略的事例,将理论知识得以利用,在例子中穿插着复习了前头的知识:使用Loquacious配置和ConfOrm映射。

5.边框设置

边框能够由此工具栏设置,此时安装边框是依照外界框的高低来展示,下面框的装置也得以经过安装下划线,此时上面框的长短是基于数据展现的长度来支配,还足以安装属性“underline”为true,此时也是遵照边框的尺寸来显示的。

 

陆.表格设置

壹)表格的体系数:通过品质设置ColumnCount和RowCount设置。

二)合并/分割单元格:选中须要联合/分割的单元格,右键单击,选择“合并单元格”/“分割单元格”,如图:

威尼斯人线上娱乐 63

三)插入行列:选中某行、某列,右键单击,接纳需求插入的地点,如图:

威尼斯人线上娱乐 64威尼斯人线上娱乐 65

陆.表格设置

1)表格的队列数:通过品质设置ColumnCount(列)和RowCount(行)设置。

二)合并/分割单元格:选中供给统1/分割的单元格,右键单击,选用“合并单元格”/“分割单元格”,如图:

                                       
       威尼斯人线上娱乐 66

 

3)插入行列:选中某行、某列,右键单击,选择须求插入的任务,如图:

                                 
  威尼斯人线上娱乐 67威尼斯人线上娱乐 68

 

伍.常用代码

五.常用代码

 

一.在文件编辑器中编辑

法斯特report软件自个儿带了很多成效实现多少的转移,直接在编辑框中即可实现。

威尼斯人线上娱乐 69

常用的作用有:

威尼斯人线上娱乐 70挑选语句IFF;控制语句Switch;

威尼斯人线上娱乐 71截取字符串语句SubString,在text列表中精选SubString

威尼斯人线上娱乐 72截取时间语句Date&Time:

威尼斯人线上娱乐 73算数运算语句Mathematical:常用的有Abs。

只顾,在采用那些function的时候,在文件编辑器右下角会彰显当前效能的用法规则,如图:

威尼斯人线上娱乐 74威尼斯人线上娱乐 75

若当前数据类型不知足规则,则必要选择方面包车型地铁变换语句,将其转换到与规则相符的数据类型,才能选拔那么些function,不然会报错。

一.在文书编辑器中编辑

 

法斯特report软件本人带了不少功能落成数量的更换,直接在编写框中即可兑现。

                           
 威尼斯人线上娱乐 76

 

常用的功力有:              

                                     
  威尼斯人线上娱乐 77选料语句IFF;控制语句Switch;

                           
 威尼斯人线上娱乐 78截取字符串语句SubString,在text列表中采用SubString

                               
 威尼斯人线上娱乐 79截取时间语句Date&Time:

     
                                 
 威尼斯人线上娱乐 80算数运算语句Mathematical:常用的有Abs(取相对值)。

 

小心,在采取那个function的时候,在文件编辑器右下角会呈现当前效应的用法规则,如图:

 

威尼斯人线上娱乐 81威尼斯人线上娱乐 82

若当前数据类型不知足规则,则需求运用方面包车型地铁变换语句,将其转换来与规则相符的数据类型,才能采取这个function,不然会报错。

 

2.在code区编写

稍加数据的更换在编辑器中无法直接促成,要求在code区域编写代码。写代码此前供给定义到相应的事件上:选中必要写代码的多寡所在的报表拦,在性质设置中式点心击,在事件中双击需求运用的事件,自动跳转到code区,且会现出一行代码,类似于privatevoidGroupHeader1_BeforePrint(objectsender,EventArgse)

{

}

报表中常用事件有BeforePrint,AfterPrint。

2.在code区编写

 

多少数据的转换在编辑器中无法一向促成,要求在code区域编写代码。写代码以前需求定义到相应的事件上:选中须要写代码的多寡所在的表格拦,在性质设置中式点心击,在事件中双击须求选取的轩然大波,自动跳转到code区,且会现出1行代码,类似于private void GroupHeader1_BeforePrint(object sender, EventArgs e)

 

    {

 

    }

 

报表中常用事件有BeforePrint,AfterPrint。

 

3.常用代码

一)Data1.InitDataSource();//数据起头化,用于数据跑五遍

2)有的供给把年月日进展分离呈现,此时急需选取时间并选用只显示时间的某部分,比如某些DateTime二类型的参数值为二〇一一091玖,现要求将其年月日分手,分别以__年__月__日突显,需求采取fastreport提供的效劳实行分离,即第11中学的方法,可是注意此种方法只可以用于数据类型为datetime的数码;对于非datetime型的数额,能够写代码取位数只怕拓展强制转换,以string为例:

privatevoidColumnFooter1_BeforePrint(objectsender,EventArgse)

{

stringtbrq=Report.GetColumnValue(“Table1.TBRQ”));

if(!String.IsNullOrEmpty

{

Text9.Text=tbrq.Substring+”年”+tbrq.Substring+”月”+tbrq.Substring+”日”;

}//字符串型用SubString,Substring代表从第0位初叶,取出二位作为年。

叁)小数位的支配:能够用format对具备数据的小数位进行支配,但只对于数值型的数据才有效,不过对于string型的则供给用语句进行落到实处,如:

decimalsl=Report.GetColumnValue(“dtfee.Quantity”);

Cell5一.Text=sl.ToString;//”0.00″若不填则依照暗中认可值显示,后边多少个零出示出来的数据即为有微微个小数;对于数据,有时要求要求有小数时则突显小数,无小数时则呈现整数,此时只要求将”0.00″改为”0.##”即可,##的个数也是足以自定义的,表示展现的最多的小数位。

3.常用代码

 

一)Data一.InitDataSource();//数据开首化,用于数据跑五次

 

二)有的必要把年月日实行分离展现,此时亟需选拔时间并精选只体现时间的某部分,比如有些DateTime二类型的参数值为二〇一一0919,现供给将其年月日分手,分别以__年__月__日呈现,需求运用fastreport提供的职能进行分离,即1中的方法,然则注意此种方法只可以用来数据类型为datetime的多少;对于非datetime型的多少,能够写代码取位数可能拓展强制转换,以string为例:

 

private void ColumnFooter1_BeforePrint(object sender, EventArgs e)

 

    {

 

      string  tbrq=  ((String)Report.GetColumnValue(“Table1.TBRQ”));

 

      if (!String.IsNullOrEmpty(tbrq))

 

      {

 

        Text9.Text = tbrq.Substring(0,4) + “年” + tbrq.Substring(4,2) + “月”+tbrq.Substring(6,2)+”日”;

 

      }//字符串型用SubString,Substring(0,四)表示从第0位开头,取出多少人作为年。

 

叁)小数位的支配:能够用format对拥有数据的小数位进行控制,但只对于数值型的数目才有效,不过对于string型的则需求用语句实行落实,如:

 

decimal sl= ((Decimal)Report.GetColumnValue(“dtfee.Quantity”);

 

Cell5一.Text=sl.ToString(“0.00”);// “0.00”若不填则根据默许值显示,后边多少个零出示出来的数码即为有微微个小数;对于数据,有时要求需求有小数时则展现小数,无小数时则显示整数,此时只需求将”0.00″改为”0.##”即可,##的个数也是足以自定义的,表示突显的最多的小数位。

 

破例效果汇总

非同小可效率汇总

 

壹.打字与印刷中落到实处空表格填满剩余的空行,达到钦赐的行数。

1.打印中得以实现空表格填满剩余的空行,达到钦点的行数。

 

1.单页展现钦命行数

为了能让多少在未填满的前提下,该页也能显得钦点的行数N,须求在数据区添加子报表,且需求安装其属性最少数据行(CompleteToNRows)为N。

威尼斯人线上娱乐 83

一.单页彰显钦定行数

 

为了能让数据在未填满的前提下,该页也能展现钦赐的行数N,必要在数据区(data)添加子报表(child),且必要设置其质量最少数据行(CompleteToNRows)为N。

威尼斯人线上娱乐 84

 

 

 

 

                             

二.服从数据行数展现钦命行数

依据1的安装,预览的时候会发现该操作只会控制首页满意条件,当数码的行数超越一页时,后边页均依据有微微多少显示多少行,此时亟待写代码控制。

如:

privatevoidPageHeader1_AfterPrint(objectsender,EventArgse)

{if(Engine.FinalPass)

{

Child1.CompleteToNRows=Report.GetVariableValue(“TotalPages”))*20;

}//依照总页数*20来控制CompleteToNRows。

}

此时报表拦中的child区CompleteToNRows设置为一,如图:

威尼斯人线上娱乐 85

二.遵纪守法数据行数字彰显示钦点行数

 

遵纪守法一的安装,预览的时候会发觉该操作只会决定首页满意条件,当数码的行数超越一页时,前边页均根据有多少多少呈现多少行,此时亟待写代码控制。

 

如:

 

private void PageHeader1_AfterPrint(object sender, EventArgs e)

 

{      if (Engine.FinalPass)

 

      {

 

        Child1.CompleteToNRows = ((Int32)Report.GetVariableValue(“TotalPages”)) * 20;

 

      }//依据总页数*20来控制CompleteToNRows。

 

}

 

那儿报表拦中的child区CompleteToNRows设置为一,如图:

威尼斯人线上娱乐 86

二.本页合计和本期合计

二.本页合计和本期合计

1.本页合计

在每页均会来得,且总计当前页相关数据的和。此时勾选“打字与印刷后重置”项,再将合计项移到对应的职位即可。如图:

威尼斯人线上娱乐 87

一.本页合计

在每页均会显得,且计算当前页相关数据的和。此时勾选“打字与印刷后重置”项,再将协商项移到对应的任务即可。如图:

 

 

 威尼斯人线上娱乐 88

二.本期小计

在每页均会显得,可是指在多少的结尾1页突显合计的数目,总括当前报表的持有数据和;必要写total来估测计算当前值,只是本期小计中打字与印刷后重置这么些本性不勾选,由于本期小计只在最后1页显示数据,其余页面上数据区均为空,必要代码控制,例如:

privatevoidColumnFooter1_BeforePrint(objectsender,EventArgse)

{

ifReport.GetVariableValue!=Report.GetVariableValue(“TotalPages”)))//设置展现本期小计须求的规格,即当前页与总页数相平等的时候,初始显得数据,不然为空。

二.本期小计

在每页均会显得,可是指在多少的终极1页显示合计的数量,总计当前报表的具有数据和;须求写total来计量当前值,只是本期小计中打字与印刷后重置那些性子不勾选,由于本期小计只在最终壹页展现数据,别的页面上数据区均为空,须要代码控制,例如:

private void ColumnFooter1_BeforePrint(object sender, EventArgs e)

    {

      if(((Int32)Report.GetVariableValue(“Page”))!=((Int32)Report.GetVariableValue(“TotalPages”)))//设置呈现本期小计必要的规范,即当前页与总页数相平等的时候,早先呈现数据,不然为空。

三.交叉表的用法

参照模板收取费用员结账汇总报表.frx

注意交叉表的行列宽度不需安装,自动依照数据长短进行安装。

三.交叉表的用法 (演示)

参照模板    收取费用员结账汇总报表.frx

留意交叉表的类别宽度不需安装,自动依照数据长短进行安装。

4.套打模板

参考模板门诊挂号发票.frx,处方笺.frx

登记发票的模板

小心,在周浦档次中,由于处方笺模板不等同,在医务卫生职职员和工人作站会基于选拔调用差别的模版,此时是将两种分裂的模板组合在1块,再依照标志调用相应的沙盘。

肆.套打模板(演示)

参照模板   门诊挂号发票(套打).frx,处方笺(综合).frx

挂号发票的模板

在意,在周浦品种中,由于处方笺模板不1致,在医务职职员和工人作站会依据选拔调用不相同的模版,此时是将两种差异的模版组合在①起,再依照标志调用相应的沙盘。

伍.超链接模板

伍.超链接模板(演示)

报表&单据导入

报表&单据导入

一.单据导入

票据即由开发平素传入数据源,在模块中贯彻单据的绘图。

步骤:找到相对应的模块,点击打字与印刷,进入空白模板,再实行统一筹划。对于曾经绘制好的模版,能够一贯导入,但只顾,必须在地面把数据源清空,再导入,不然将汇合世data区重复,导致命名出现分外,如data1一。

稍加模板就算清空数据源导入到模板,照旧会报错,则须求重新新建三个模板,再将原模板的事物复制进去即可。

相关联的表有:select*fromCommon.ReportTemplate

一. 票据导入

票据即由开发直接传入数据源,在模块中落实单据的绘图。

手续:找到绝对应的模块,点击打印,进入空白模板,再展开设计。对于已经绘制好的模板,能够向来导入,但注意,必须在地头把数据源清空,再导入,不然将会出现data区重复,导致命名出现特殊,如data1壹。

有个别模板即便清空数据源导入到模板,还是会报错,则供给再行新建三个模板,再将原模板的事物复制进去即可。

相关联的表有:select * from Common.ReportTemplate

贰.报表导入

报表即由存款和储蓄进程达成,然后再对应到相应的储存进度,去存款和储蓄进程中的数据。

步骤:报表管理à新建报表à填写相应的新闻后保存à绘制模板

专注:填写新闻时要绑定正确的贮存进程,同时经过前台改变相应的界面展现效果。

累加数据源:选拔sql,再接纳相应的蕴藏进度,显明即可,对于新建的模板,模板一栏不需求采用,若采用了则会调用以前存在的模版,同时更改的话也会潜移默化从前的模板。

威尼斯人线上娱乐 89威尼斯人线上娱乐 90

相关联的表有:

select*fromCommon.Report

select*fromCommon.ReportDataSource

select*fromCommon.ReportTemplate

select*fromCommon.ReportFolder

select*fromCommon.ReportParameter

证实:fastreport自个儿带有德姆o,里面很多效果都以足以供大家学习参考的。

2.报表导入

报表即由存款和储蓄进程达成,然后再对应到相应的储存进度,去存款和储蓄进程中的数据。

步骤:报表管理à新建报表à填写相应的消息后保存(演示)à绘制模板

在意:填写新闻时要绑定正确的贮存进度,同时经过前台改变相应的界面显示效果。

加上数据源:选用sql,再选拔相应的储存进程,分明即可,对于新建的沙盘,模板壹栏不须求选取,若选用了则会调用从前存在的模板,同时改变的话也会影响以前的沙盘。

威尼斯人线上娱乐 91威尼斯人线上娱乐 92

相关联的表有:

select * from Common.Report 

select * from Common.ReportDataSource

select * from Common.ReportTemplate

select * from Common.ReportFolder

select * from Common.ReportParameter

 

申明:fastreport自个儿带有德姆o,里面很多职能都以能够供大家学习参考的。

 

 

 

                              

 

 

 

 

 

 

 

 

 


相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图