1.写在前面
如果你是和我一样,第一次接触DevExpress,并且因为网上资源眼花缭乱无从下手,然后脑子一转直接到DevExpress官网寻找官方使用文档的,那我们的了解顺序应该差不多是一致的。
DevExpress官网:https://www.devexpress.com
然而,官网也是乱花渐欲迷人眼,这里直接放上被我找出的:winform版本devexpress 报表设计说明文档;
实际上参考意义较多的是这个模块: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();
然后,按照向导到这个提示窗,可以直接勾选需要载入的数据库中的表。
这样直接勾选然后点 NEXT 完成数据源添加的效果相当于数据库中的这条语句:
select * from student;
即:没有任何限制条件的查询出该表中数据
如果,需要依据相关限制条件(比如 select * from 【表名】where 【条件】之类的)查询得到数据,需要执行下面操作(先取消勾选上面的表)。
即创建新的查询(Queries)语句,点击其右侧的加号,跳转至新的窗口。
创建查询语句的窗口如下,左上角板块显示的是数据库中的表,我们现在仍然选择查询student这个表,用鼠标将student这张表拖拽着右侧空白区域。
可以勾选需要查询的字段,会实时在右侧显示相关查询语句
同时,可以右击相关字段,选择依据该字段排序查询或者分组查询
比如我选择按照学生id从小到大查询
查询语句建立过程中,可以点击窗口左下角的结果预览,查看查询的数据结果。
当前的查询结果如下:
此外,可以自己手动编辑查询语句,如实现如下的查询:
select * from student where student_id = 1;
需要注意设计界面sql语句书写方式的不同。不过,一般情况下不选择用这种方式筛选数据,因为它不灵活,无法在实施运行中给定我们需要查询的范围,下面会借助“报表参数”进行数据筛选。
最后,编辑好查询语句后可以“OK”后返回,在菜单栏选择以下选项可以看到数据源以及添加成功:
演示设计端报表控件绑定数据源的操作,添加两个文本控件,直接拖拽数据库相应字段到文本控件上,然后控件上会显示“黄色的小数据库”标识,即算绑定成功。
进行输入操作,使得每一张报表上只显示一条数据的信息
然后,可以直接点击预览,查看报表效果;
到这里,在报表设计端绑定数据库数据源的资本操作已经基本完成。
/**************************************************************************************************************/
为了在界面端实现数据库数据筛选(实现常见的where语句操作),引入报表参数。
这里是官方文档关于报表参数的说明:报表参数;
首先,创建报表参数:
例如,将会使用该报表参数约束学生的id, 将该参数的值设置为“动态的”,并绑定数据库表中学生的id字段:
然后,使用该报表参数 对报表数据进行筛选“filter”:
这个表达式的意思是:报表只显示指定学生id的一条数据(“==”,你也可以在“Operators”中选择大于或者小于等条件,或者点击“ok”后在点击AND后的“+”号新建一条“与条件”,进而实现大于…且…小于…的效果)。
现在,再次预览,是如下效果,会在加载报表前,让你指定报表参数的值,而这个值我们绑定了数据源,可以直接拖拉选择,这个值我们以“学生名字”显示(即value和display)。
到这里,在报表设计界面添加数据库数据源的大部分常用操作已经完成。
第二种:在后端使用代码实现(主要涉及使用DevExpress提供的数据库连接以及语句查询语法)
官方说明文档:在运行时连接sql server数据库
虽然只提到了连接sql server数据库形式的代码,但是本节文档一开始就提到了支持的众多数据库,所以其他数据库肯定也是可以的。
首先,这里以常见的根据“数据库连接字符串”连接方式进行说明。
如果你使用的不是sql server数据库,比如我使用的是sqlite数据库,只需要替代“CustomStringConnectionParameters”类即可,点击上图中箭头指向的类名:
再继续点:
sqlite数据库对应的是:SQLiteConnectionParameters,在vs中实例化该类,可见需要提供的数据库参数:
因此,通过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,如下:
然后,建立数据库连接后,还需要添加查询语句(和常规的过程一样),代码示例的话,同一官方文档页面也有,以上的github程序里也有系统的说明。
我选择的是常规的方式,毕竟熟悉:
创建查询语句后,将查询语句关联到数据库:
//添加一个常规查询语句
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);
注释:
- 报告怎么打印显示,可以移步到我的其他帖子。
- 因为使用了传统的查询语句,可以直接灵活的在查询语句中筛选数据,所以并未引入报表参数,感兴趣的可以自行到官网了解报表参数以及数据源筛选的代码实现。
- 完整的系统的代码可以参考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.设计页面设计和后端代码设计相结合:
优点:有效避免了第一套方案中需要考虑数据库路径的问题,开发较为灵活;
缺点:部分操作需要大量代码实现,开发效率略低,但可以接受。