Oracle APEX交互式网格:跨筛选保留行选中状态的实现方案咨询
解决Oracle APEX交互式网格筛选后选中状态丢失问题
方案一:通过PL/SQL查询预设选中状态
这种方式需要先存储用户选中的行ID,再在查询中标记选中状态,让交互式网格加载时自动选中对应行。
- 存储选中行ID:创建一个隐藏页面项(比如
P1_SELECTED_IDS,类型设为“隐藏”,分隔符用逗号),用于保存用户选中的行主键ID集合。同时创建动态动作,当交互式网格行选择变化时,用JS把选中行的ID更新到这个页面项中(代码参考方案二的第一步)。 - 修改PL/SQL查询:在交互式网格的数据源查询中,新增一个计算列标记选中状态,示例如下:
SELECT t.*, CASE WHEN :P1_SELECTED_IDS IS NOT NULL AND t.id IN (SELECT column_value FROM apex_string.split(:P1_SELECTED_IDS, ',')) THEN 'Y' ELSE 'N' END AS is_selected FROM your_table t WHERE t.category = :P1_CATEGORY; - 配置交互式网格选中规则:进入交互式网格的属性面板,找到“选择”→“选中列”,将其设置为新增的
is_selected列,这样网格加载时会自动将标记为Y的行设为选中状态。 - 注意事项:如果用户跨会话操作,建议用
APEX_COLLECTION替代页面项存储选中ID,避免页面刷新或会话过期导致数据丢失。
方案二:通过动态动作恢复选中状态
如果不想修改PL/SQL查询,可通过JS动态动作在筛选后重新选中之前的行。
- 第一步:保存选中行ID
创建动态动作,触发条件为“交互式网格 - 行选择变化”,执行JavaScript代码收集选中行ID并保存到隐藏页面项:// 替换ig_static_id为你的交互式网格静态ID,ID为表主键列名 var ig = apex.region("ig_static_id").widget(); var selectedRecords = ig.interactiveGrid("getViews", "grid").model.getSelectedRecords(); var selectedIds = selectedRecords.map(record => record[ig.model.getFieldKey("ID")]).join(","); apex.item("P1_SELECTED_IDS").setValue(selectedIds); - 第二步:筛选后恢复选中状态
创建另一个动态动作,触发条件为“选择列表 - 值变化”(即切换类别的选择列表),执行时机设为“交互式网格刷新后”,执行以下JavaScript代码:// 替换ig_static_id为你的交互式网格静态ID,ID为表主键列名 var ig = apex.region("ig_static_id").widget(); var selectedIds = apex.item("P1_SELECTED_IDS").getValue().split(","); if (selectedIds.length > 0 && selectedIds[0] !== "") { var gridView = ig.interactiveGrid("getViews", "grid"); var model = gridView.model; model.forEach(record => { var rowId = record[model.getFieldKey("ID")].toString(); if (selectedIds.includes(rowId)) { model.selectRecord(record); } }); } - 注意事项:如果交互式网格开启了分页,只有当前页存在的选中行才能被恢复选中,不在当前页的行无法显示选中状态,这种情况下建议结合方案一使用。
内容的提问来源于stack exchange,提问作者Jason Bourne
相关产品推荐
相关产品推荐

