本文共 6534 字,大约阅读时间需要 21 分钟。
如何在业务系统中集成设计器并构造报表模板
在业务系统中集成设计器时,为用户提供灵活的数据表创建机制,使用户无需深入了解后台逻辑和代码,只需选择关联的数据表,系统即可自动生成可供用户直接使用的数据集。本文将详细讲解如何构造三种报表模板,并阐述DataRelation类在动态绑定数据集中的应用。
一、构造报表模板
1. 创建RDL报表 使用PageReport对象并添加必要属性:
public static void BuildRdlReportLayout(Design.Designer designer){ PageReport report = new PageReport(); report.Report.Body.Height = "5cm"; report.Report.Width = "20cm"; report.Load(new StringReader(report.ToRdlString())); // report = LayoutBuilder.AddDataSetDataSource(report); // 添加数据源 report = LayoutBuilder.addDataSet(report); MemoryStream reportStream = LayoutBuilder.LoadReportToStream(report); reportStream.Position = 0; designer.LoadReport(XmlReader.Create(reportStream), DesignerReportType.Page);} 2. 创建页面报表 页面报表采用字符串构造方式,避免默认生成RDL报表:
public static void BuildPageReportLayout(Design.Designer designer){ PageReport report = new PageReport(); report.Load(new StringReader(@" 27.9cm 2.5cm 2.5cm 27.9cm 21.6cm 2.5cm 2.5cm ")); report = LayoutBuilder.AddDataSetDataSource(report); MemoryStream reportStream = LayoutBuilder.LoadReportToStream(report); reportStream.Position = 0; designer.LoadReport(XmlReader.Create(reportStream), DesignerReportType.Page);} 3. 页面报表与RDL报表的数据集绑定 由于页面报表和RDL报表在代码层面上是相同的,均可视为PageReport,因此绑定数据集的方法相同:
public static PageReport AddDataSetDataSource(PageReport report){ // 创建数据源 DataSource dataSource = new DataSource(); dataSource.Name = "Reels Database"; dataSource.ConnectionProperties.DataProvider = "DATASET"; dataSource.ConnectionProperties.ConnectString = ""; // 创建数据集 DataSet dataSet = new DataSet(); Query query = new Query(); dataSet.Name = "Sample DataSet"; query.DataSourceName = "Reels Database"; query.CommandType = QueryCommandType.Text; query.CommandText = ""; String[] fieldsList = { "MoviedID", "Title", "YearReleased", "MPAA" }; foreach (string fieldName in fieldsList) { Field field = new Field(fieldName, fieldName, null); dataSet.Fields.Add(field); } // 将数据源和数据集添加到报告 report.Report.DataSources.Add(dataSource); report.Report.DataSets.Add(dataSet); return report;} 4. 创建区域报表并添加数据 区域报表的构造方式与页面报表类似:
public static void BuildSectionReportLayout(Design.Designer designer){ string rpx = " "; DataTable dt = new DataTable(); dt.Columns.Add("Col1"); dt.Columns.Add("Col2"); dt.Columns.Add("Col3"); designer.Report = null; designer.LoadReport(XmlReader.Create(LayoutBuilder.CovertStringToStream(rpx)), DesignerReportType.Section); SectionReport sr2 = designer.Report as SectionReport; sr2.DataSource = dt;} 5. 修改ReportsForm_Load方法 在设计器中加载报表后,用户可通过预览按钮查看实时数据:
LayoutBuilder.BuildRdlReportLayout(this.reportDesigner);// 添加预览按钮fileMenu.DropDownItems.Add(new ToolStripMenuItem("预览", null, new EventHandler(OnViewReport)));// 实现预览功能private void OnViewReport(object sender, EventArgs e){ ReportViewer viewer = new ReportViewer(); viewer.Report = reportDesigner.Report; viewer.ReportType = reportDesigner.ReportType; viewer.ShowDialog();}// 获取数据集并绑定字段private void LoadDataSet(object sender, LocateDataSourceEventArgs args){ string constr = @"Provider=sqloledb; password=xA123456;data source=10.32.2.28;initial catalog=NWind_CHS;user id=sa;"; DataSet myDataSet = new DataSet(); DataTable[] myDataTables = new DataTable[3]; myDataTables[0] = new DataTable(Constants.SaleTableName); myDataTables[1] = new DataTable(Constants.SaleDetailsTableName); myDataTables[2] = new DataTable(Constants.CustomerTableName); myDataSet.Tables.Add(myDataTables[0]); OleDbDataAdapter oleAdapter1 = new OleDbDataAdapter(Constants.cmdText1, new OleDbConnection(constr)); oleAdapter1.Fill(myDataSet.Tables[0]); myDataSet.Tables.Add(myDataTables[1]); OleDbDataAdapter oleAdapter2 = new OleDbDataAdapter(Constants.cmdText2, new OleDbConnection(constr)); oleAdapter2.Fill(myDataSet.Tables[1]); myDataSet.Tables.Add(myDataTables[2]); OleDbDataAdapter oleAdapter3 = new OleDbDataAdapter(Constants.cmdText3, new OleDbConnection(constr)); oleAdapter3.Fill(myDataSet.Tables[2]); // 创建DataRelation实例 DataRelation Customers_Orders = new DataRelation("C_O", myDataSet.Tables[2].Columns["客户ID"], myDataSet.Tables[0].Columns["客户ID"]); myDataSet.Relations.Add(Customers_Orders); DataRelation Orders_OrderDetails = new DataRelation("O_OD", myDataSet.Tables[0].Columns["订单ID"], myDataSet.Tables[1].Columns["订单ID"]); myDataSet.Relations.Add(Orders_OrderDetails); args.Data = myDataSet.Tables[0];} 以上内容详细介绍了如何构造三种报表模板,并阐述了DataRelation类在动态绑定数据集中的应用。通过以上方法,用户可以轻松地设计满足需求的报表,并通过预览功能查看实时数据。
转载地址:http://yjyfz.baihongyu.com/