1.写在前面

如果你是和我一样,第一次接触DevExpress,并且因为网上资源眼花缭乱无从下手,然后脑子一转直接到DevExpress官网寻找官方使用文档的,那我们的了解顺序应该差不多是一致的。

DevExpress官网:https://www.devexpress.com

devexpress 图形报表 dev报表控件_c#

然而,官网也是乱花渐欲迷人眼,这里直接放上被我找出的:winform版本devexpress 报表设计说明文档;

devexpress 图形报表 dev报表控件_Devexpress_02

实际上参考意义较多的是这个模块:Detailed Guide to DevExpress Reporting

实际上,官方说明文档的内容非常详细,主要介绍两种设计方式

第一种:在VS新建的报表设计页面使用前端设计向导进行设计(几乎不用代码),这也是官网提供的比较系统的一套教学说明文档;

第二种:通过代码在后端进行实现;

总的来说,官网说明文档还是比较侧重于无代码实现的,毕竟为了实现对开发者友好,更加快速地 开发产品。如果需要代码实现,需要根据文档中提供的资源自行摸索,没有特别详细特别系统的代码实现教程。

其他内容不多说,本次只针对报表控件绑定数据库数据源的操作进行说明。内容略多,请合理安排阅读时间,耐心阅读。

第一种:使用报表页面的数据源绑定向导

官方说明:通过向导绑定数据库数据源

首先,按照向导到这个窗口,选择自己使用的数据库进行连接,前提是项目已经引入数据库加载所依赖的dll。我使用的是SQLITE数据库(sql大系列的),依赖的是System.Data.SQLite.dll。

这一步骤相当于以下代码,即:连接到数据库

public static string connectionString = "Data Source=" + DataBasePath + ";password=" + DataBasePwd;
SQLiteConnection con = new SQLiteConnection(connectionString);
con.Open();

devexpress 图形报表 dev报表控件_devexpress 图形报表_03

然后,按照向导到这个提示窗,可以直接勾选需要载入的数据库中的表。

这样直接勾选然后点 NEXT 完成数据源添加的效果相当于数据库中的这条语句:

select * from student;

即:没有任何限制条件的查询出该表中数据

devexpress 图形报表 dev报表控件_sqlite_04

如果,需要依据相关限制条件(比如 select * from 【表名】where 【条件】之类的)查询得到数据,需要执行下面操作(先取消勾选上面的表)。

即创建新的查询(Queries)语句,点击其右侧的加号,跳转至新的窗口。

devexpress 图形报表 dev报表控件_devexpress 图形报表_05

创建查询语句的窗口如下,左上角板块显示的是数据库中的表,我们现在仍然选择查询student这个表,用鼠标将student这张表拖拽着右侧空白区域。

devexpress 图形报表 dev报表控件_数据库_06

可以勾选需要查询的字段,会实时在右侧显示相关查询语句

devexpress 图形报表 dev报表控件_数据库_07

同时,可以右击相关字段,选择依据该字段排序查询或者分组查询

devexpress 图形报表 dev报表控件_数据库_08

比如我选择按照学生id从小到大查询

devexpress 图形报表 dev报表控件_sqlite_09

查询语句建立过程中,可以点击窗口左下角的结果预览,查看查询的数据结果。

devexpress 图形报表 dev报表控件_sqlite_10

当前的查询结果如下:

devexpress 图形报表 dev报表控件_Devexpress_11


此外,可以自己手动编辑查询语句,如实现如下的查询:

select * from student where student_id = 1;

需要注意设计界面sql语句书写方式的不同。不过,一般情况下不选择用这种方式筛选数据,因为它不灵活,无法在实施运行中给定我们需要查询的范围,下面会借助“报表参数”进行数据筛选。

devexpress 图形报表 dev报表控件_数据库_12

最后,编辑好查询语句后可以“OK”后返回,在菜单栏选择以下选项可以看到数据源以及添加成功:

devexpress 图形报表 dev报表控件_c#_13

演示设计端报表控件绑定数据源的操作,添加两个文本控件,直接拖拽数据库相应字段到文本控件上,然后控件上会显示“黄色的小数据库”标识,即算绑定成功。

devexpress 图形报表 dev报表控件_Devexpress_14

进行输入操作,使得每一张报表上只显示一条数据的信息

devexpress 图形报表 dev报表控件_数据库_15


然后,可以直接点击预览,查看报表效果;

devexpress 图形报表 dev报表控件_c#_16


devexpress 图形报表 dev报表控件_sqlite_17

到这里,在报表设计端绑定数据库数据源的资本操作已经基本完成。

/**************************************************************************************************************/

为了在界面端实现数据库数据筛选(实现常见的where语句操作),引入报表参数

这里是官方文档关于报表参数的说明:报表参数

首先,创建报表参数

devexpress 图形报表 dev报表控件_c#_18

例如,将会使用该报表参数约束学生的id, 将该参数的值设置为“动态的”,并绑定数据库表中学生的id字段:

devexpress 图形报表 dev报表控件_devexpress 图形报表_19


然后,使用该报表参数 对报表数据进行筛选“filter”:

devexpress 图形报表 dev报表控件_Devexpress_20


devexpress 图形报表 dev报表控件_sqlite_21


devexpress 图形报表 dev报表控件_Devexpress_22

这个表达式的意思是:报表只显示指定学生id的一条数据(“==”,你也可以在“Operators”中选择大于或者小于等条件,或者点击“ok”后在点击AND后的“+”号新建一条“与条件”,进而实现大于…且…小于…的效果)。

现在,再次预览,是如下效果,会在加载报表前,让你指定报表参数的值,而这个值我们绑定了数据源,可以直接拖拉选择,这个值我们以“学生名字”显示(即value和display)。

devexpress 图形报表 dev报表控件_Devexpress_23


devexpress 图形报表 dev报表控件_c#_24


devexpress 图形报表 dev报表控件_devexpress 图形报表_25

到这里,在报表设计界面添加数据库数据源的大部分常用操作已经完成。

第二种:在后端使用代码实现(主要涉及使用DevExpress提供的数据库连接以及语句查询语法)

官方说明文档:在运行时连接sql server数据库

虽然只提到了连接sql server数据库形式的代码,但是本节文档一开始就提到了支持的众多数据库,所以其他数据库肯定也是可以的。

首先,这里以常见的根据“数据库连接字符串”连接方式进行说明。

devexpress 图形报表 dev报表控件_c#_26


如果你使用的不是sql server数据库,比如我使用的是sqlite数据库,只需要替代“CustomStringConnectionParameters”类即可,点击上图中箭头指向的类名:

devexpress 图形报表 dev报表控件_Devexpress_27


再继续点:

devexpress 图形报表 dev报表控件_sqlite_28


sqlite数据库对应的是:SQLiteConnectionParameters,在vs中实例化该类,可见需要提供的数据库参数:

devexpress 图形报表 dev报表控件_数据库_29


因此,通过DEV提供的数据库接口,也可以连接到数据库,sqlite的实现如下:

SqlDataSource DataSource { get; set; }//Declare a Data Source Component
        /// 客户端数据库密码
        public const string DataBasePwd = "****";
        /// 数据库路径
        public static string DataBasePath = "*****.db";
       //Connection from a String连接数据库(sqlite连接方式,DEV提供)
       SQLiteConnectionParameters connectionParameters = new SQLiteConnectionParameters(DataBasePath, DataBasePwd);
       DataSource = new SqlDataSource(connectionParameters);

可以对比 sql server 连接的区别:

SqlDataSource DataSource { get; set; }//Declare a Data Source Component
string connectionString = "XpoProvider=MSSqlServer;Data Source=(LocalDB)\\MSSQLLocalDB;" +
        "AttachDbFilename=|DataDirectory|\\Test.mdf;" +
        "Integrated Security=True;Connect Timeout=30";
CustomStringConnectionParameters connectionParameters =
    new CustomStringConnectionParameters(connectionString);
DataSource = new SqlDataSource(connectionParameters);

到此,数据库已经建立连接。

小提示:如果想深入了解代码或者了解规范完成的代码,可以参考官网提供的github小demo,如下:

devexpress 图形报表 dev报表控件_sqlite_30

然后,建立数据库连接后,还需要添加查询语句(和常规的过程一样),代码示例的话,同一官方文档页面也有,以上的github程序里也有系统的说明。

我选择的是常规的方式,毕竟熟悉:

devexpress 图形报表 dev报表控件_sqlite_31

创建查询语句后,将查询语句关联到数据库:

//添加一个常规查询语句
            DataSource.Queries.Add(CreateCustomSqlQuery());
            DataSource.RebuildResultSchema();
            public static SqlQuery CreateCustomSqlQuery()
			{
			    CustomSqlQuery query = new CustomSqlQuery();
			    query.Name = "CustomQuery";
			    query.Sql = "Select top 10 * from Products";//这里就可以直接添加筛选条件,后续不用使用报表参数也可
			    return query;
			}

其次,创建该数据库实例,并绑定报告

//创建数据库实例
     SqlDataSource ds = DataSource as SqlDataSource;

      // Bind the report to a data source.
      report.DataSource = ds;
      //使用查询语句查询绑定的数据库中的成员(表)
      report.DataMember = ds.Queries[0].Name;

最后,就可以给控件绑定数据库的字段了。

//[student_id]数据库表中字段,Text:绑定控件的文本属性
ExpressionBinding expressionBinding01 = new ExpressionBinding("BeforePrint", "Text", "[student_id]");
//xrTableCell38:报表控件的Name;
report.xrTableCell38.ExpressionBindings.Add(expressionBinding01);
ExpressionBinding expressionBinding02 = new ExpressionBinding("BeforePrint", "Text", "[student]");
report.xrTableCell39.ExpressionBindings.Add(expressionBinding02);

注释:

  1. 报告怎么打印显示,可以移步到我的其他帖子。
  2. 因为使用了传统的查询语句,可以直接灵活的在查询语句中筛选数据,所以并未引入报表参数,感兴趣的可以自行到官网了解报表参数以及数据源筛选的代码实现。
  3. 完整的系统的代码可以参考github上的程序。

第三种:在后端使用代码实现(常规方式,不使用DEV提供的数据库操作语法)

其实,到这里需要说明就不多了,感觉种方法更灵活,更方便操作一些了。

首先,按照你的数据库连接以及查询方式,返回datatable

DataTable dt = sqliteHelper.ExecuteDataTable(sql, connectionString);

然后,报告数据源直接绑定该datatable

report.DataSource = dt;

其次,就可以给控件绑定数据库的字段了。

//[student_id]数据库表中字段,Text:绑定控件的文本属性
ExpressionBinding expressionBinding01 = new ExpressionBinding("BeforePrint", "Text", "[student_id]");
//xrTableCell38:报表控件的Name;
report.xrTableCell38.ExpressionBindings.Add(expressionBinding01);
ExpressionBinding expressionBinding02 = new ExpressionBinding("BeforePrint", "Text", "[student]");
report.xrTableCell39.ExpressionBindings.Add(expressionBinding02);

结语:优缺点分析

01.通过DEV报表设计页面进行设计:

优点:对开发者友好;代码使用量少,熟悉操作后,在设计端拖拽配置即可,节省开发时间周期,能够快速设计报表程序。
缺点:对使用者不友好;在设计端绑定数据库时,只能给定数据库的绝对路径,若要拷贝到其他计算机或者打包安装部署,数据库所在的路径必须和开发时选择的数据库路径一致,否则会找不到数据库,在部署时不太友好。

02.设计页面设计和后端代码设计相结合:

优点:有效避免了第一套方案中需要考虑数据库路径的问题,开发较为灵活;
缺点:部分操作需要大量代码实现,开发效率略低,但可以接受。