当前位置: 首页 > news >正文

Winform开发报表(锐浪推方式)

Grid++Report 的报表数据来源既可以是推(PUSH)模式,也可以是拉(PULL)模式。所谓推模式就是由报表宿主程序向报表填充数据,报表引擎处于被动接受数据的形式。所谓拉模式就是报表引擎根据报表的数据源取数参数主动从数据源提取数据。

Grid++Report 的拉模式采用 OLE DB 数据引擎,OLE DB 是 Windows 系统提供的具有广泛数据访问能力的最新一代数据引擎。只要指定数据源的连接参数与查询SQL语句,就可以从各种数据源中提取数据。

Grid++Report 的推模式通过报表事件向报表宿主程序发出请求报表数据的通知,由报表宿主程序在此事件中将数据填入到报表的记录集中。采用推模式,可以将一切宿主程序能得到的数据提供给报表,这样更进一步扩大报表数据的来源。如果数据需要在程序中重新整理与加工运算,就必须采用推模式。

例子 Normal 中的报表都是采用拉模式获取报表数据。例子 ManualFillRecord 演示了推模式提供报表数据,同时也说明了在推模式下,任何数据都可以提供给 Grid++Report。

using System;
using System.Collections.Generic;
using grproLib;
using LRTMS.Common;
using LRTMS.DB;
using LRTMS.Report;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;namespace sdd Forms
{public partial class FrmTestPrint : DockContent{string sql = "";string taskId = "0", taskNo, carNo, driverName, superCargoName, Taskdate;DataTable dt, dtDetail;//定义Grid++Report报表主对象GridppReport Report = new GridppReport();public FrmTestPrint(){InitializeComponent();Report.Initialize += new _IGridppReportEvents_InitializeEventHandler(ReportInitialize);Report.FetchRecord += new _IGridppReportEvents_FetchRecordEventHandler(ReportFetchRecord);}private void tsbPrint_Click(object sender, EventArgs e){//最最重要的一句代码,Report.FetchRecord,一定要写在程序的初始事件中;Report.PrintPreview(true);}private void dataGridView2_CellClick(object sender, DataGridViewCellEventArgs e){}//在C#中一次填入一条记录不能成功,只能使用一次将记录全部填充完的方式private void ReportFetchRecord(){if (dtDetail.Rows.Count == 0) return;FillRecordToReport(Report, dtDetail);}private void FrmTestPrint_Load(object sender, EventArgs e){sql = "select * from wewe";dt = DBHelperOracle.GetTable(sql);dataGridView1.DataSource = dt;}//定义保存报表记录集的结构private struct MatchFieldPairType{public IGRField grField;public int MatchColumnIndex;}/// <summary>/// 将 DataTable 的数据转储到 Grid++Report 的数据集中/// </summary>/// <param name="Report">报表对象</param>/// <param name="dt">DataTable对象</param>public void FillRecordToReport(IGridppReport Report, DataTable dt){if (dtDetail.Rows.Count == 0) return;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();}}private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e){if (e.RowIndex < 0) return;string taskId = dataGridView1.Rows[e.RowIndex].Cells["task_id"].Value.ToString();dtDetail = DBHelperOracle.GetTable("select * from wewg where task_id=" + taskId);dataGridView2.DataSource = dtDetail;}//报表初始化void ReportInitialize(){if (dataGridView1.Rows.Count < 0) return;int i = dataGridView1.CurrentCell.RowIndex;if (i < 0) return;taskNo = dataGridView1.Rows[i].Cells["TASK_BILL_NO"].Value.ToString();carNo = dataGridView1.Rows[i].Cells["car_number"].Value.ToString();driverName = dataGridView1.Rows[i].Cells["driver_name"].Value.ToString();Taskdate = dataGridView1.Rows[i].Cells["create_time"].Value.ToString();superCargoName = dataGridView1.Rows[i].Cells["SUPERCARGO_NAME"].Value.ToString();taskId = dataGridView1.Rows[i].Cells["task_id"].Value.ToString();Report.LoadFromFile("Report\\pcd.grf");Report.ParameterByName("task_no").AsString = taskNo;//主报表传参Report.ParameterByName("car_no").AsString = carNo;//主报表传参Report.ParameterByName("driver_name").AsString = driverName;//主报表传参Report.ParameterByName("supercargo").AsString = superCargoName;//主报表传参Report.ParameterByName("bill_date").AsString = Taskdate;//主报表传参
        }}
}

 

http://www.jsqmd.com/news/17575/

相关文章:

  • 2025年通风天窗厂家最新权威推荐榜:排烟天窗、通风气楼、屋顶通风器、顺坡气楼、10A通风天窗、1型通风天窗、TC5A通风天窗、TC12B通风天窗、屋脊通风天窗专业选购指南
  • 【LeetCode】125. 验证回文串
  • Toposort
  • 2025年冲压件厂家权威推荐榜:新能源/光伏/精密/异形/五金/铝/汽配/不锈钢/家具冲压件源头企业深度解析
  • AI 产品测试企业内训 | 两天构建企业级智能体测试能力
  • 详细介绍:《掰开揉碎讲编程-短篇》 2025 汉化idea控制台出现乱码解决方案 看完这篇解决不了乱码也是神人了
  • 探索无限可能:生成式推荐的演进、前沿与挑战【AI业务应用方向】
  • 【隐语SecretFlow架构解读】隐私保护模型在线推理系统 SecretFlow-Serving 架构解读
  • 2025年储罐厂家权威推荐榜:钢衬塑储罐,钢塑复合储罐,化工储罐,防腐储罐,PE储罐,盐酸储罐,硫酸储罐,聚丙烯储罐,不锈钢储罐,次氯酸钠储罐
  • 多晶硅
  • 2025 最新推荐!溴化锂回收公司精选榜单:制冷机 / 溶液 / 机组回收服务商权威测评及选择指南
  • Qt 解决 ld: framework ‘AGL‘ not found
  • 技术指标分享--单趋势通道
  • 2025年地坪厂家权威推荐榜:环氧地坪漆,聚氨酯地坪,固化耐磨地坪,防腐地坪,室外路面防滑地坪,运动地面,PVC塑胶地板,魔石地坪公司精选
  • 微算法科技(MLGO)研发突破性低复杂度CFG算法,成功缓解边缘分裂学习中的掉队者问题
  • 大语言模型的微调策略
  • 结对项目—小学四则运算题目生成器
  • 阅读笔记一:程序员的自我定位与成长基石
  • SQL 子查询与多表 JOIN 用法大全(速查版) - 实践
  • Excel学习指南
  • 2025 年宁波北仑仓库服务商推荐新世洋集团,港口物流仓储的专业之选宁波北仑仓库推荐
  • 2025年聚氨酯厂家权威推荐榜:浇注型聚氨酯/聚氨酯预聚体/聚氨酯胶黏剂/聚氨酯组合料/密封胶/胶辊/制品原料,源头厂家技术实力与产品应用深度解析
  • 02-02串口-单片机发送数据,电脑串口调试助手接收数据
  • 2025年CNC高压清洗机厂家推荐排行榜:CNC全自动/数控高压清洗机、双工位/卧式清洗机、去毛刺/螺纹孔清洗机、工业/欧洲清洗机精选
  • 2025 矿物铸件源头厂家推荐榜:南通盟鼎新材料 5 星领跑,适配机床 / 电子 / 自动化设备基座需求
  • 2025年家纺摄影公司推荐排行榜,南通摄影公司,家纺产品摄影,电商家纺拍摄,品牌家纺视觉策划专业团队
  • 2025 年国内锅炉厂家最新推荐排行榜:聚焦智能控制与稳定可靠的品牌深度解析电/蒸汽/燃气/燃油/电蒸汽锅炉公司推荐
  • 遗传算法入门
  • 2025年冲压件厂家权威推荐榜:新能源/光伏/精密/异形/五金/铝/汽配/不锈钢/家具冲压件源头实力解析
  • 3 大 Python 库助力高效 PDF 文件压缩 - E