C#程序设计第九章水晶报表设计与产品发布本章任务•能使用水晶报表设计器设计报表•能在报表中设置数据筛选、排序与分组•能通过创建安装项目的方法进行应用程序打包任务9.1“学生信息管理系统”项目——学生成绩报表设计在前面介绍的任务8.3框架的基础上,添加一个窗体到“学生信息管理系统”项目的表示层项目中,用于显示成绩查询报表。在查询条件中输入相应的条件后单击“生成报表”按钮,在窗体右侧的报表显示控件中将会显示符合条件的学生成绩信息任务9.1“学生信息管理系统”项目——学生成绩报表设计•在本任务中我们使用了CrystalReportViewer控件来显示报表,使用报表设计器设计了报表的格式,并完成了基于三层架构为报表提供动态的数据源代码的编写。水晶报表设计器不仅提供了设计报表格式的工具,同时它还能实现报表数据的排序、筛选和分组显示等功能在数据库中添加表和视图创建报表显示窗体在“学生信息管理系统”的表示层项目中,添加一个窗体StuResultsReport作为报表显示窗体,窗体上的控件类型及布局如图所示设计报表文档在表示层项目中添加新建项,项目类型选择“Reporting”,模板选择“Crystal报表”,命名为“StuResultsReport”,如图所示,完成后的报表格式如右图所示完成后的报表格式如图所示添加数据访问层代码•在数据访问层项目添加一个StuResaultDB.cs类,在该类中设计一个GetStuResaults()方法,用于实现返回一个DataTable数据集,StuResaultDB.cs类代码如下publicclassStuResaultDB{publicDataTableGetStuResaults(stringsql){returnDBHelper.GetDataSet(sql).Tables[0];}}添加业务逻辑层代码publicclassStuResaultService{StuResaultDBsrdb=newStuResaultDB();//实例化一个数据访问层类对象publicDataTableGetStuResaultBysql(stringsql){returnsrdb.GetStuResaults(sql);}}在业务逻辑层项目中添加一个StuResaultService.cs类,设计一个GetStuResaultBysql()方法,用于为数据访问层提供服务,代码如下:运行调试代码编写完成后按F5进行调试,不输入任何查询条件,按“生成成绩报表”按钮,报表运行结果如图所示CrystalReportViewer控件属性属性说明DisplayToolbar设置报表工具栏是显示还是隐藏DisplayStatusBar设置报表状态栏是显示还是隐藏EnableToolTips设置是否在报表查看器中显示工具栏ReportSource设置报表文档源Crystal报表设计器报表数据排序记录排序专家记录排序结果报表数据分组2、分组结果1、组专家对话框报表数据筛选1、选择专家对话框2、数据筛选结果在报表中插入图表1、图表专家对话框2、运行结果任务9.2“学生信息管理系统”项目——应用程序打包发布•将“学生信息管理系统”项目打包发布到其他计算机上,要求:•(1)能在桌面和程序菜单中为应用程序创建快捷方式并指定快捷方式的图标;•(2)能创建与应用程序安装对应的卸载程序;•(3)能安装系统数据库。创建安装部署项目添加项目输出生成安装文件添加程序卸载类classProgram{staticvoidMain(string[]args){stringsysroot=System.Environment.SystemDirectory;stringproductcode={95394279-B44B-4C36-8D5C-7AF496FF7EA0};System.Diagnostics.Process.Start(sysroot+\\msiexec.exe,/x+productcode+/qr);}}•Program.cs关键代码:添加快捷方式及运行结果添加数据安装程序类添加类代码//该方法的功能是创建附加数据库的SQL操作语句,请注意底纹部分的代码应根据应用程序中数据库连接、字符串中的database的值做相应的改动privatestringCreateSqlStr(){stringsqlstr=;stringdatafile=System.IO.Path.Combine(dbpath,StudentManagement.mdf);stringlogfile=System.IO.Path.Combine(dbpath,StudentManagement_log.ldf);sqlstr=execsp_attach_dbN'StudentManagement',N'+datafile+',N'+logfile+';returnsqlstr;}privatevoidExecuteSql(stringDatabaseName,stringSqlStr){stringSqlConnectionStr=@server=+servername+;uid=+username+;pwd=+password;SqlConnectionmyConnection=newSqlConnection(SqlConnectionStr);SqlCommandmyCommand=newSqlCommand(SqlStr,myConnection);myCommand.Connection.Open();myCommand.Connection.ChangeDatabase(DatabaseName);myCommand.ExecuteNonQuery();myCommand.Connection.Close();}设计用户界面添加自定义窗体项目运行结果谢谢!