OpenEdge Browse中按Enter键跳转至右侧单元格的需求
自定义OpenEdge Browse组件Enter键跳转行为
要修改特定Browse组件的Enter键行为,让按下Enter时跳转到当前单元格右侧单元格,而非同一列下一行,可以通过拦截Browse的KEY事件实现,具体步骤如下:
- 拦截Enter键事件:在目标Browse的KEY触发器中捕获Enter键(ASCII码10),覆盖默认逻辑。
- 获取当前单元格位置:通过Browse的
CURRENT-COLUMN和CURRENT-ROW属性获取当前选中的列、行索引。 - 计算目标单元格:将当前列索引+1,若到达最后一列则可根据需求重置为第一列。
- 设置新选中单元格:调用
SET-CELL()方法定位到目标单元格,再通过SET-FOCUS()确保焦点转移,最后用RETURN NO-APPLY阻止默认行为。
示例代码
/* 替换browse-name为你的Browse组件名称 */ ON KEY OF browse-name DO: IF LASTKEY = 10 THEN { /* 捕获Enter键 */ DEFINE VARIABLE iCurrCol AS INTEGER NO-UNDO. DEFINE VARIABLE iNextCol AS INTEGER NO-UNDO. DEFINE VARIABLE iCurrRow AS INTEGER NO-UNDO. /* 获取当前选中的列和行 */ iCurrCol = browse-name:CURRENT-COLUMN. iCurrRow = browse-name:CURRENT-ROW. /* 计算下一列,最后一列则跳转至第一列 */ iNextCol = iCurrCol + 1. IF iNextCol > browse-name:NUM-COLUMNS THEN iNextCol = 1. /* 定位到目标单元格并设置焦点 */ browse-name:SET-CELL(iCurrRow, iNextCol). browse-name:SET-FOCUS(). /* 阻止默认的Enter键行为 */ RETURN NO-APPLY. } END.
针对特定列的扩展
如果仅需要指定列(如示例中的“Sacar de Lima”列)触发该行为,其他列保留默认逻辑,可添加列名判断:
ON KEY OF browse-name DO: IF LASTKEY = 10 THEN { DEFINE VARIABLE iCurrCol AS INTEGER NO-UNDO. DEFINE VARIABLE iNextCol AS INTEGER NO-UNDO. DEFINE VARIABLE iCurrRow AS INTEGER NO-UNDO. iCurrCol = browse-name:CURRENT-COLUMN. iCurrRow = browse-name:CURRENT-ROW. /* 仅对指定列执行自定义跳转 */ IF browse-name:COLUMN(iCurrCol):NAME = "Sacar de Lima" THEN { iNextCol = iCurrCol + 1. IF iNextCol > browse-name:NUM-COLUMNS THEN iNextCol = 1. browse-name:SET-CELL(iCurrRow, iNextCol). browse-name:SET-FOCUS(). RETURN NO-APPLY. } ELSE { /* 其他列保留默认Enter键行为 */ RETURN APPLY. } } END.
该方案适用于OpenEdge 11.6.4版本,无论Browse是基于临时表还是物理表的freeform query创建,均可正常生效。
内容的提问来源于stack exchange,提问作者Ezequiel
相关产品推荐
相关产品推荐

