Oracle Apex Interactive Grid按钮点击后遍历选中行方法咨询
Oracle APEX Interactive Grid 自定义按钮遍历选中行方案
核心问题说明
自定义按钮触发动态动作时,执行上下文this指向按钮组件本身,而非Interactive Grid实例,因此直接调用this.data.selectedRecords会返回空值,必须通过IG的公开API获取选中数据,不需要额外绕路。
原代码存在的问题
- 上下文依赖错误:自定义按钮场景下
this.data为undefined,外层判断逻辑永远不会执行 - 变量名不匹配:循环内赋值的变量是
product_wizard_code,最终打印的是未赋值的id变量 - 值覆盖问题:循环内反复给
id、value单变量赋值,最终只能拿到最后一行的数值,无法获取所有选中行数据 - 隐式全局变量风险:循环变量
i未声明,容易引发全局变量污染
可直接运行的实现代码
将以下代码绑定到自定义按钮UpdateButton的点击动态动作(执行JavaScript类型)即可:
// 初始化IG相关实例,不依赖this上下文 const igGrid = apex.region("InterfaceGrid").widget().interactiveGrid("getViews", "grid"); const igModel = igGrid.model; // 获取选中行:当前页选中用igGrid.getSelectedRecords(),跨页全选用igModel.getSelectedRecords() const selectedRows = igGrid.getSelectedRecords(); // 无选中行时直接提示退出 if (selectedRows.length === 0) { apex.message.alert("请先勾选需要操作的数据行"); return; } // 用数组存储所有行数据,避免循环覆盖 const rowDataList = []; // 遍历选中行 for (let i = 0; i < selectedRows.length; i++) { const currentRow = selectedRows[i]; if (!currentRow) continue; // 读取文本类型ID列值 const rowId = igModel.getValue(currentRow, "ID"); // 读取选择列表Value列值:.v为列表存储的实际值,.d为列表显示的文本,按需取用 const rowValue = igModel.getValue(currentRow, "VALUE").v; // 存入结果集 rowDataList.push({ id: rowId, value: rowValue }); // 单行业务逻辑可直接写在此处 console.log("当前行数据:", rowId, rowValue); } // 遍历完成后可执行批量业务逻辑 console.log("所有选中行数据:", rowDataList);
注意事项
- 代码中填写的列名
ID、VALUE必须和IG中列定义的*Column Name(静态ID)*完全一致,大小写敏感 - 选择列表取值时如果需要获取用户看到的显示文本,把
.v替换为.d即可 - 如果开启了IG的跨页选择功能,需要获取所有分页下勾选的行,将获取选中行的代码替换为
const selectedRows = igModel.getSelectedRecords(); - 批量操作建议先收集完所有行数据再统一提交,不要在循环内发起重复AJAX请求,避免性能问题
内容的提问来源于stack exchange,提问作者Łukasz Kudelski
相关产品推荐
相关产品推荐

