嵌入的DC怎么使用Filter,怎么刷新对应的Table


#1

在使用嵌入DC的时候,如官方例子sample-sales-cuba7中order-edit.xml

<instance id=“orderDc”
class=“com.company.sales.entity.Order”
view=“order-edit”>
<loader id=“orderDl”/>
<collection id=“linesDc”
property=“lines”/>
</instance>

有如下问题:
1、由于linesDc不能设置loader,我想给下面的linesTable增加filter,请问该怎么写?
2、我用代码实现了在新增订单明细的时候设置默认的金额值,但是不知道在保存后怎么刷新表格显示出来,代码如下:

@Subscribe(“linesTable.create”)
protected void onLinesTableCreateActionPerformed(Action.ActionPerformedEvent event) {
Order order=getEditedEntity();
final OrderLine line = metadata.create(OrderLine.class);
line.setOrder(order);
line.setQuantity(new BigDecimal(2));
Screen screen = screenBuilders.editor(OrderLine.class, this).withParentDataContext(dataContext).editEntity(line).build();
screen.addAfterCloseListener(e -> {
//这里怎么刷新表格显示新增的OrderLine数据
});
screen.show();
}


#2

社区都没人答复问题了么


#3

跪求回答啊:skull_and_crossbones:


#4

你好

  1. 不明白你的具体需求,如果要过滤明细表格,看看这个是否能满足要求:
    http://cuba-platform.cn:9080/manual-7.0-chs/gui_property_containers.html
  2. 设置初始值的方法在 7.0 有变化,可以这样:

#5

也可以使用 InitEntityEvent 来为实体设置初始值:

文档地址:
http://cuba-platform.cn:9080/manual-7.0-chs/screen_controller_events.html


#6

谢谢答复,我的意思是我想在界面上放一个filter,filter需要设置dataLoader属性,这个场景中的collection没有loader(linesDc),我不知道怎么设置了;
第二个问题我不是问怎么设置初始值,是我想在窗口关闭后刷新这个table,我也没法拿到Dataloader,所以不能调用其load方法去刷新数据!


#7

第二个问题,你是要实现能刷新表格数据,用我说的方法就可以。


#8

推荐使用 InitEntityEvent 来设置初始值,
另外注意尽量一个帖子描述一个问题


#9

我需要的是从数据库里重新加载数据,类似DataLoader上的load 方法,你说的什么方法可以实现?


#10

@weborld
如果明细表过大,那就需要换一种方式实现,不要使用嵌套的属性集合容器。单独再定义一个集合容器,这样更灵活一点。
http://cuba-platform.cn:9080/manual-7.0-chs/gui_data_comp_dep.html


#11

好吧,那也就是说这种模式下,界面上也没法放Filter控件了,是吧


#12

不要用嵌套的集合属性容器,单独建一个集合容器,应该可以给这个集合容器绑定过滤器。

试试吧,有结果了反馈一下。


#13

界面上可以放filter:


然后在OrderEdit.java中添加如下代码可以满足你的要求:

    @Inject
    private Filter linesFilter;

    @Inject
    private InstanceContainer<Order> orderDc;

    @Inject
    private CollectionPropertyContainer<OrderLine> linesDc;

    @Inject
    private DataComponents dataComponents;

    @Subscribe
    private void onAfterShow(AfterShowEvent event) {

        DataContext dataContext = dataComponents.createDataContext();
        getScreenData().setDataContext(dataContext);

        CollectionLoader<OrderLine> linesDl = dataComponents.createCollectionLoader();
        linesDl.setContainer(linesDc);
        linesDl.setDataContext(dataContext);
        linesDl.setView("orderLine-with-product");
        linesDl.setQuery("select l from sales_OrderLine l where l.order = :order");
        linesDl.setParameter("order",orderDc.getItem());

        this.linesFilter.setDataLoader(linesDl);
    }

目前看,需要手动创建DL,在xml里面没法创建DL应该是个bug。


#14

您好,能把XML发一下吗?不清楚界面上的linesDc是否还要设置property


#15

xml 还是用的示例程序的。我只是加了filter

        <instance id="orderDc"
                  class="com.company.sales.entity.Order"
                  view="order-edit">
            <loader id="orderDl"/>
            <collection id="linesDc"
                        property="lines"/>
        </instance>

#16

试了下可以用。:grin:
dataContext 直接用界面上的,自己创建保存会只保存子表。