Oracle Apex交互式网格搜索后选中记录无法持久化问题求助
Oracle Apex Interactive Grid 搜索后保持选中记录持久化的解决方案
默认的persistSelection: true仅支持分页时的选中状态保留,无法覆盖搜索/过滤场景,以下是两种可行的自定义实现方案:
方案一:通过页面项持久化选中主键
步骤1:创建隐藏页面项
新建一个隐藏类型的页面项(例如P1_SELECTED_IDS),用于存储选中行的主键值,格式为逗号分隔的字符串。
步骤2:监听行选择事件,更新页面项
在Interactive Grid的JavaScript初始化代码中添加以下逻辑,每次选中状态变化时更新页面项:
function(options) { options.defaultGridViewOptions = { persistSelection: true }; const ig = apex.region(options.regionId).widget().interactiveGrid("getViews", "grid"); const pkField = ig.model.getFieldKey("ID"); // 替换为你的主键列名 // 监听行选择变化事件 ig.on("selectionchange", function() { const selectedIds = ig.getSelectedRecords().map(record => record[pkField]).join(","); apex.item("P1_SELECTED_IDS").setValue(selectedIds); }); return options; }
步骤3:刷新后恢复选中状态
添加一个动态动作,触发时机选择「Interactive Grid 刷新后」,执行以下JavaScript代码:
const ig = apex.region("YOUR_IG_STATIC_ID").widget().interactiveGrid("getViews", "grid"); // 替换为你的IG静态ID const pkField = ig.model.getFieldKey("ID"); // 替换为你的主键列名 const selectedIds = apex.item("P1_SELECTED_IDS").getValue().split(","); if (selectedIds.length > 0 && selectedIds[0] !== "") { ig.model.forEach(record => { const recordId = record[pkField].toString(); if (selectedIds.includes(recordId)) { ig.setSelectedRecords([record], true); // true表示追加选中,不清除现有选中 } }); }
方案二:监听IG过滤事件,实时保存/恢复选中状态
直接在IG初始化代码中监听过滤的开始与结束事件,无需额外页面项:
function(options) { options.defaultGridViewOptions = { persistSelection: true }; const ig = apex.region(options.regionId).widget().interactiveGrid(); const gridView = ig.getViews("grid"); const pkField = gridView.model.getFieldKey("ID"); // 替换为你的主键列名 let savedSelectedIds = []; // 过滤开始前保存当前选中的主键 ig.on("filterstart", function() { savedSelectedIds = gridView.getSelectedRecords().map(record => record[pkField].toString()); }); // 过滤结束后恢复选中状态 ig.on("filterend", function() { if (savedSelectedIds.length === 0) return; gridView.model.forEach(record => { const recordId = record[pkField].toString(); if (savedSelectedIds.includes(recordId)) { gridView.setSelectedRecords([record], true); } }); }); return options; }
注意事项
- 确保主键列在IG的模型中存在(即使列被隐藏也不影响,只要查询语句包含该列)
- 若数据量极大,保存大量选中ID可能存在性能损耗,可根据业务需求调整为仅保留关键选中记录
- 测试时覆盖搜索、分页、多条件过滤等场景,验证选中状态的正确性
内容的提问来源于stack exchange,提问作者vr_oracle
相关产品推荐
相关产品推荐

