# 动态DataSource

# 概念

当表单中某个控件需要在用户操作表单其他控件或表单变量变化时,展示出不同范围的可选值,可以结合onFieldChange事件,对Code类型控件的DataSource进行动态赋值。

情况1:当控件影响值为唯一,例如 控件X 的可选数据只受 控件A 的数值变化,通常可以做code代码表parent级联实现。

情况2:当控件影响值不唯一,例如 控件A 、 控件B 、表单变量 均有机会影响到 控件X 的可选项数据, 则需要通过onFieldChange事件进行动态查询和筛选将结果集赋值给 控件X 的DataSource。

# 需求场景

  • 表单控件B根据用户对控件A操作的选项,动态筛选出与A控件选择项有关的

# 开发要点

  • 表单中 "参与方式" 根据 "申报方向" 选项值,进行动态赋值下拉选项

  • “申报方向” 需要设置onFieldChange事件

  • “参与方式” 代码类型忽略“内部代码表”或“外部代码表”

  • 本案例为简要说明,未使用多个控件值作为查询条件





  • messenger onFiledChange 事件

public InfoPlusResponse onFieldChanging(InfoPlusEvent e){
    MajorProjectPlanApply app=e.toBean(MajorProjectPlanApply.class);
    switch(e.getChangingField()){
        //申报方向事件
        case"fieldProjectDirection":
            if(app.getProjectDirection()!=null && StringUtils.isNotEmpty(app.getProjectDirection().getCodeId())){
                //根据申报方向id查询筛选过滤值
                CodeItem p=majorProjectPlanManager.getParticipation(app.getProjectDirection().getCodeId());
                app.setParticipation(p);
            }
            break;
    }
    InfoPlusResponse response=new InfoPlusResponse(e,app);
    return response;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  • “参与方式”控件 取值及赋值实现
public CodeItem getParticipation(String sourceCode) {
    //查询条件
    Map<MajorProjectParticipationQueryCondition, Object> conditions = new HashMap();
    conditions.put(MajorProjectParticipationQueryCondition.DIRECTION_CODE_EQ, sourceCode);
    //查询结果
    List<MajorProjectParticipation> list = majorProjectParticipationDAO.getList(conditions, 0, -1, null, true);
    //结果转换
    Map<String, String> participationMap = new HashMap<String, String>();
    String codes="";
    String names = "";
    if (!CollectionUtils.isEmpty(list)) {
        codes = list.stream().map(MajorProjectParticipation::getCode).collect(Collectors.joining("\n"));
        names = list.stream().map(MajorProjectParticipation::getName).collect(Collectors.joining("\n"));
    }
    //dataSource属性赋值
    participationMap.put("datasource", codes);
    participationMap.put("datasource_Names", names);
    CodeItemImpl codeItem = new CodeItemImpl();
    codeItem.setAttributes(participationMap);
    return codeItem;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# CheckList

# 因CheckList控件绑定特殊性,动态赋值需要额外用一个隐藏控件作为数据来源

  • 效果

  • 增加一个隐藏控件

  • 可在messenger Rendering 或 onFiledChange 事件中对数据赋值

  • 样例中数据查询条件及实现此处省略

public InfoPlusResponse onStepFillRequestRendering(InfoPlusEvent e) {
    InfoPlusExampleParallelAdvanced form = e.toBean(InfoPlusExampleParallelAdvanced.class);
    form.setMemberFavoritesDataSource("旅行\n摄影\n电影\n游戏\n音乐\n极限运动");
    InfoPlusResponse response=new InfoPlusResponse(e, form);
    return response;
}
1
2
3
4
5
6
  • 数据赋值隐藏控件,CheckList控件使用DataSource属性设置进行绑定