logo资料库

C#在Winform开发中使用Grid++报表.pdf

第1页 / 共11页
第2页 / 共11页
第3页 / 共11页
第4页 / 共11页
第5页 / 共11页
第6页 / 共11页
第7页 / 共11页
第8页 / 共11页
资料共11页,剩余部分请下载后查看
C#在在Winform开发中使用 主要介绍了C#在Winform开发中使用Grid++报表,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习 价值,需要的朋友们下面随着小编来一起学习学习吧 开发中使用Grid++报表报表 之前一直使用各种报表工具,如RDLC、DevExpress套件的XtraReport报表,在之前一些随笔也有介绍,最近接触锐浪的Grid++报表,做了一些测 试例子和辅助类来处理报表内容,觉得还是很不错的,特别是它的作者提供了很多报表的设计模板案例,功能还是非常强大的。试着用来做一些简 单的报表,测试下功能,发现常规的二维表、套打、条形码二维码等我关注的功能都有,是一个比较强大的报表控件,本篇随笔主要介绍在Winform 开发中使用Grid++报表设计报表模板,以及绑定数据的处理过程。 1、报表模板设计 、报表模板设计 这个报表系统,报表模板提供了很多案例,我们可以大概浏览下其功能。 它对应在相应的文件目录里面,我们可以逐一查看了解下,感觉提供这么多报表还是很赞的,我们可以参考着来用,非常好。
整个报表主要是基于现有数据进行一个报表的模板设计的,如果要预览效果,我们一般是需要绑定现有的数据,可以从各种数据库提供数据源,然 后设计报表模板,进行实时的数据和格式查看及调整。 空白的报表模板大概如下所示,包含页眉页脚,以及明细表格的内容。 根据它的教程,模仿着简单的做了一个报表,也主要是设计报表格式的调整,和数据源的处理的关系,我们做一个两个报表就可以很快上手了。 为了动态的加入我们表格所需要的列,我们可以通过数据库里面的字段进行加入,首先提供数据源,指定我们具体的表即可(如果是自定义的信 息,则可以手工添加字段)
这个里面就是配置不同的数据库数据源了 如SQLServer数据库的配置信息如下。
为了方便,我们可以利用案例的Access数据库,也就是Northwind.mdb来测试我们的报表,弄好这些我们指定对应的数据表数据即可。 这里面配置好数据库表信息后,我们就可以用它生成相关的字段和对应的列信息了 修改列的表头,让它符合中文的表头列,如下所示。
我们在页脚出,加入了打印时间,页码的一些系统变量,具体操作就是添加一个综合文本,然后在内容里面插入指定的域内容即可,如下所示 预览报表,我们就可以看到具体的报表格式显示了。 通过上面的操作,感觉生成一个报表还是很方便的,接着我有根据需要做了一个二维码的报表显示,方便打印资产标签。
绑定数据源显示的报表视图如下所示,看起来还是蛮好的。 2、数据绑定 、数据绑定 一般我们绑定数据源,有的时候可以直接指定数据库连接,有时候可以绑定具体的数据列表,如DataTable或者List这样的数据源,不同的方式报 表控件的代码绑定不同。 直接绑定数据表的路径如下所示。 /// /// 普通连接数据库的例子-打印预览 /// private void btnNormalDatabase_Click(object sender, EventArgs e) { Report = new GridppReport(); string reportPath = Path.Combine(Application.StartupPath, "Reports\\testgrid++.grf"); string dbPath = Path.Combine(Application.StartupPath, "Data\\NorthWind.mdb"); //从对应文件中载入报表模板数据 Report.LoadFromFile(reportPath); //设置与数据源的连接串,因为在设计时指定的数据库路径是绝对路径。 if (Report.DetailGrid != null) { string connstr = Utility.GetDatabaseConnectionString(dbPath); Report.DetailGrid.Recordset.ConnectionString = connstr; } Report.PrintPreview(true); } 而如果需要绑定和数据库无关的动态数据源,那么就需要通过控件的FetchRecord进行处理了,如下代码所示。
Report.FetchRecord += new _IGridppReportEvents_FetchRecordEventHandler(ReportFetchRecord); 通过这样我们增加每一个对应的列单元格信息,如下是随带案例所示 //在C#中一次填入一条记录不能成功,只能使用一次将记录全部填充完的方式 private void ReportFetchRecord() { //将全部记录一次填入 Report.DetailGrid.Recordset.Append(); FillRecord1(); Report.DetailGrid.Recordset.Post(); Report.DetailGrid.Recordset.Append(); FillRecord2(); Report.DetailGrid.Recordset.Post(); Report.DetailGrid.Recordset.Append(); FillRecord3(); Report.DetailGrid.Recordset.Post(); } private void FillRecord1() { C1Field.AsString = "A"; I1Field.AsInteger = 1; F1Field.AsFloat = 1.01; } private void FillRecord2() { C1Field.AsString = "B"; I1Field.AsInteger = 2; F1Field.AsFloat = 1.02; } private void FillRecord3() { C1Field.AsString = "C"; I1Field.AsInteger = 3; F1Field.AsFloat = 1.03; } 这样处理肯定很麻烦,我们常规做法是弄一个辅助类,来处理DataTable和List等这样类型数据的动态增加操作。 /// /// 绑定实体类集合的例子-打印预览 /// private void btnBindList_Click(object sender, EventArgs e) { Report = new GridppReport(); //从对应文件中载入报表模板数据 string reportPath = Path.Combine(Application.StartupPath, "Reports\\testList.grf"); Report.LoadFromFile(reportPath); Report.FetchRecord += ReportList_FetchRecord; Report.PrintPreview(true); } /// /// 绑定DataTable的例子-打印预览 /// private void btnBindDatatable_Click(object sender, EventArgs e) { Report = new GridppReport(); //从对应文件中载入报表模板数据 string reportPath = Path.Combine(Application.StartupPath, "Reports\\testList.grf"); Report.LoadFromFile(reportPath); Report.FetchRecord += ReportList_FetchRecord2; Report.PrintPreview(true); } private void ReportList_FetchRecord() { List list = BLLFactory.Instance.GetAll(); GridReportHelper.FillRecordToReport(Report, list); } private void ReportList_FetchRecord2() { var dataTable = BLLFactory.Instance.GetAllToDataTable(); GridReportHelper.FillRecordToReport(Report, dataTable); } 其中辅助类GridReportHelper 代码如下所示。 /// /// Gird++报表的辅助类 /// public class GridReportHelper { private struct MatchFieldPairType { public IGRField grField; public int MatchColumnIndex; }
/// /// 将 DataReader 的数据转储到 Grid++Report 的数据集中 /// /// 报表对象 /// DataReader对象 public static void FillRecordToReport(IGridppReport Report, IDataReader dr) { MatchFieldPairType[] MatchFieldPairs = new MatchFieldPairType[Math.Min(Report.DetailGrid.Recordset.Fields.Count, dr.FieldCount)]; //根据字段名称与列名称进行匹配,建立DataReader字段与Grid++Report记录集的字段之间的对应关系 int MatchFieldCount = 0; for (int i = 0; i < dr.FieldCount; ++i) { foreach (IGRField fld in Report.DetailGrid.Recordset.Fields) { if (string.Compare(fld.RunningDBField, dr.GetName(i), true) == 0) { MatchFieldPairs[MatchFieldCount].grField = fld; MatchFieldPairs[MatchFieldCount].MatchColumnIndex = i; ++MatchFieldCount; break; } } } // 将 DataReader 中的每一条记录转储到Grid++Report 的数据集中去 while (dr.Read()) { Report.DetailGrid.Recordset.Append(); for (int i = 0; i < MatchFieldCount; ++i) { var columnIndex = MatchFieldPairs[i].MatchColumnIndex; if (!dr.IsDBNull(columnIndex)) { MatchFieldPairs[i].grField.Value = dr.GetValue(columnIndex); } } Report.DetailGrid.Recordset.Post(); } } /// /// 将 DataTable 的数据转储到 Grid++Report 的数据集中 /// /// 报表对象 /// DataTable对象 public static void FillRecordToReport(IGridppReport Report, DataTable dt) { MatchFieldPairType[] MatchFieldPairs = new MatchFieldPairType[Math.Min(Report.DetailGrid.Recordset.Fields.Count, dt.Columns.Count)]; //根据字段名称与列名称进行匹配,建立DataReader字段与Grid++Report记录集的字段之间的对应关系 int MatchFieldCount = 0; for (int i = 0; i < dt.Columns.Count; ++i) { foreach (IGRField fld in Report.DetailGrid.Recordset.Fields) { if (string.Compare(fld.Name, dt.Columns[i].ColumnName, true) == 0) { MatchFieldPairs[MatchFieldCount].grField = fld; MatchFieldPairs[MatchFieldCount].MatchColumnIndex = i; ++MatchFieldCount; break; } } } // 将 DataTable 中的每一条记录转储到 Grid++Report 的数据集中去 foreach (DataRow dr in dt.Rows) { Report.DetailGrid.Recordset.Append(); for (int i = 0; i < MatchFieldCount; ++i) { var columnIndex = MatchFieldPairs[i].MatchColumnIndex; if (!dr.IsNull(columnIndex)) { MatchFieldPairs[i].grField.Value = dr[columnIndex]; } } Report.DetailGrid.Recordset.Post(); } } /// /// List加载数据集 /// /// /// 报表对象 /// 列表数据 public static void FillRecordToReport(IGridppReport Report, List list) { Type type = typeof(T); //反射类型 MatchFieldPairType[] MatchFieldPairs = new MatchFieldPairType[Math.Min(Report.DetailGrid.Recordset.Fields.Count, type.GetProperties().Length)]; //根据字段名称与列名称进行匹配,建立字段与Grid++Report记录集的字段之间的对应关系 int MatchFieldCount = 0;
分享到:
收藏