如何在Progress 4GL动态Browse中为多行单元格设置颜色?
解决Progress 4GL动态Browse多行单元格上色问题
你的核心问题是直接修改列的BGCOLOR属性——这是全局列属性,只会影响当前显示的行,无法实现多行单元格的差异化上色。要针对特定行的特定单元格设置颜色,需要利用Browse的ROW-DISPLAY触发器结合单元格级的样式设置方法。
修正方案步骤
- 保留你现有列句柄存储的逻辑,用于后续遍历目标列;
- 给Browse绑定
ROW-DISPLAY触发器,该触发器会在每一行显示前触发,正好用来处理单行的单元格样式; - 在触发器中通过
SET-CELL-BGCOLOR方法,针对满足条件的行设置指定列的背景色。
完整修正代码
/* DEFINITIONS - 保留原列句柄存储逻辑 */ DEFINE TEMP-TABLE ttField FIELD hHandle AS HANDLE FIELD cField AS CHARACTER. /* 在Browse初始化过程中执行(比如procedure initialiseBrowse) */ DEF VAR hTemp AS HANDLE NO-UNDO. hTemp = BROWSE {&BROWSE-NAME}:FIRST-COLUMN. REPEAT: CREATE ttField. ASSIGN ttField.cField = hTemp:NAME ttField.hHandle = hTemp. IF VALID-HANDLE(hTemp:NEXT-COLUMN) THEN hTemp = hTemp:NEXT-COLUMN. ELSE LEAVE. END. /* 给Browse添加ROW-DISPLAY触发器,绑定到处理过程 */ BROWSE {&BROWSE-NAME}:ADD-TRIGGER("ROW-DISPLAY", "rowDisplayTrigger"). /* 核心:ROW-DISPLAY触发器处理过程 */ PROCEDURE rowDisplayTrigger: DEF VAR hBrowse AS HANDLE NO-UNDO. DEF VAR hBuffer AS HANDLE NO-UNDO. DEF VAR iRow AS INTEGER NO-UNDO. /* 替换为你的目标字段列表,用逗号分隔,比如"OrderStatus,Amount" */ DEF VAR cTargetFields AS CHARACTER NO-UNDO INITIAL "FIELD-LIST". /* 获取当前Browse实例和对应的缓冲区 */ hBrowse = THIS-PROCEDURE:HANDLE. hBuffer = hBrowse:QUERY:GET-BUFFER-HANDLE(1). iRow = hBrowse:CURRENT-ROW. /* 判断当前行是否满足上色条件,替换为你的业务逻辑 */ IF /* 示例:hBuffer:BUFFER-FIELD("Status"):VALUE = "异常" */ TRUE THEN DO: /* 遍历目标列,设置对应单元格背景色 */ FOR EACH ttField WHERE LOOKUP(ttField.cField, cTargetFields) > 0: hBrowse:SET-CELL-BGCOLOR(iRow, ttField.hHandle:COLUMN-NUMBER, 12). END. END. ELSE DO: /* 可选:不满足条件时恢复默认背景色 */ FOR EACH ttField WHERE LOOKUP(ttField.cField, cTargetFields) > 0: hBrowse:SET-CELL-BGCOLOR(iRow, ttField.hHandle:COLUMN-NUMBER, ?). END. END. END PROCEDURE.
关键说明
- ROW-DISPLAY触发器:每一行即将显示时自动触发,确保逐行处理样式,避免仅第一行生效的问题;
- SET-CELL-BGCOLOR方法:这是Progress专门用于设置单个单元格背景色的方法,参数依次为
行号、列号、颜色值(12对应红色); - 行条件判断:通过Browse的
CURRENT-ROW获取当前行号,再通过缓冲区hBuffer读取该行数据,实现精准的行筛选; - 临时表
ttField:存储列的句柄和名称,方便快速遍历需要上色的目标列,无需重复遍历Browse的列集合。
内容的提问来源于stack exchange,提问作者AbsolutistK
相关产品推荐
相关产品推荐

