【开发示例】- 单据体控件常用操作代码示例原创
金蝶云社区-唐佐平
唐佐平
5人赞赏了该文章 277次浏览 未经作者许可,禁止转载编辑于2024年06月05日 14:59:40

1、单据体数据行遍历

DynamicObjectCollection entryRows = this.getModel().getEntryEntity("单据体标识");
for (DynamicObject entryObj : entryRows) {
    //修改某行的某个字段的值
    entryObj.set("kded_textfield", "测试");
}


2、对单据体指定行赋值

this.getModel().setValue("字段标识","字段值",index);


3、单据体新增行几种方式

方式①:新增一行

int i = this.getModel().createNewEntryRow(单据体标识);
this.getModel().setValue("字段标识1", "字段值1", i);
this.getModel().setValue("字段标识2", "字段值2", i);


方式②:新增多行

int[] newEntryRow = this.getModel().batchCreateNewEntryRow("单据体标识", 新增的行数);
for (int index : newEntryRow) {
    this.getModel().setValue("字段标识", "字段值", index);
}


方式③:创建单据体行对象新增行

如果单据体字段有设置默认值,此方式默认值会覆盖代码设置的值

DynamicObject entry = ORM.create().newDynamicObject(this.getModel().getEntryEntity("单据体标识    ").getDynamicObjectType());
entry.set("textfield1","44");
entry.set("amountfield",10);
int rowindex = this.getModel().createNewEntryRow("单据体标识", entry);


方式④:通过数据包新增行

获取单据体数据包,在数据包新增行对象,是需要代码调用updateView才会将新内容显示到界面上。

DynamicObjectCollection entryentityCols =   this.getModel().getDataEntity(true).getDynamicObjectCollection("entryentity");
DynamicObject entryCol = entryentityCols.addNew();
entryCol.set("textfield", "字段值");
this.getView().updateView("entryentity");


方式⑤:通过数据包新增行(另一钟方式)

DynamicObjectCollection entryColl = this.getModel().getEntryEntity("entryentity");
DynamicObjectType entryType = entryColl.getDynamicObjectType();
DynamicObject entryObj = new DynamicObject(entryType);
entryObj.set("textfield", "字段值");
entryColl.add(entryObj);
this.getView().updateView("entryentity");


4、树形单据体操作

       树形单据体和单据体操作是一致的,比单据体多了一个隐藏的pid字段,通过pid关联父节点数据行。


5、子单据体操作

       单据体的操作,同样适用于子单据体,在操作前,必须先指定子单据体的父单据体行号,否则处理的数据行会错位

//先设置父单据体选中行
this.getModel().setEntryCurrentRowIndex("entryentity",0);


6、修改单据体小数字段的“精度”

以修改一个小数字段的精度属性为例,使用以下代码,可以修改editor属性(仅限于editor属性)

方式

ClientViewProxy clientViewProxy = this.getView().getService(IClientViewProxy.class);
clientViewProxy.invokeControlMethod("单据体标识", "setColEditorProp", new Object[]{"小数字段标识", "sc", 1});


方式②


ClientViewProxy clientViewProxy = this.getView().getService(IClientViewProxy.class);
clientViewProxy.invokeControlMethod("单据体标识", "setColEditorProp", "小数字段标识", "sc", 1);


7、设置单据体样式

//设置字体颜色
IClientViewProxy proxy = this.getView().getService(IClientViewProxy.class);
ClientActions.createRowStyleBuilder().setRows(行标) .
        setForeColor("颜色如:red").buildStyle().build().invokeControlMethod(proxy, "单据体标识");

//设置背景颜色
IClientViewProxy proxy = this.getView().getService(IClientViewProxy.class);
ClientActions.createRowStyleBuilder() .setRows(行标)
        .setBackColor("颜色如:red").buildStyle().build().invokeControlMethod(proxy, "单据体标识");

//设置字体大小
IClientViewProxy proxy = this.getView().getService(IClientViewProxy.class);
ClientActions.createRowStyleBuilder() .setRows(行标)
        .setFontSize(18).buildStyle().build().invokeControlMethod(proxy, "单据体标识");


8、获取单据体当前光标所在行对象

// 获取单据体当前光标所在行
int index = this.getModel().getEntryCurrentRowIndex("单据体标识");
DynamicObject selectedData = this.getModel().getEntryRowEntity("单据体标识", index);


9、设置单据体/列表控件的选中指定行

单据体

// 获取单据体控件
EntryGrid entryGrid = this.getControl("单据体控件标识");
// 获取选中行,数组为行号,从0开始
int[] selectRows = entryGrid.getSelectRows();
// 设置选中行,第一个参数传选中行号的数组,第二个参数传入焦点行的行号,(之后不要updateView,否则会重置不生效)
entryGrid.selectRows(new int[]{0,1}, 0);
// 清空所有选中行(第一个参数传入空数组即可)
entryGrid.selectRows(new int[0], 0);
// 不要调用此方法,否则前面的设置不生效
//this.getView().updateView("单据体控件标识");

列表

// 获取单据列表控件
BillList billList =  this.getControl("billlistap");
// 获取单据列表选中行集合
ListSelectedRowCollection selectedRows = billList.getSelectedRows();
for (ListSelectedRow selectedRow : selectedRows) {
    String billNo = selectedRow.getBillNo();
}

// 设置列表选中行,参数有行号数组(后面不要调用updateView方法)
billList.selectRows(new int[] {0,1});

// 清空选中行
billList.clearSelection();

// 不要调用此方法,否则前面的设置不生效
//this.getView().updateView("billlistap");


10、根据条件锁定单据体行不能选中

在某些情况,需要锁定单据体某些行,不能选中,在表单插件中实现,代码如下(谨慎使用,里面不能有太多代码耗时逻辑,否则会影响性能):

@Override
public void initialize() {
    super.initialize();
    EntryGrid entryentity = this.getControl("单据体标识");
    entryentity.addPackageDataListener(this::packageData);
}

private void packageData(PackageDataEvent event){
    boolean status = "1".equalsIgnoreCase(event.getRowData().get("status").toString());
    if (status){
        //设置单据体行不能选择
        event.getNoLinkKey().add("f_comment");
        event.setCanSelectRow(false);
    }
}


11、对单据体数据进行过滤和排序

如果你想对单据体的数据进行过滤和排序,可参考以下代码:


//过滤
DynamicObjectCollection dymObjectCollerction = this.getModel().getEntryEntity("单据体标识");
//按字段 parent 进行过滤
List<DynamicObject> dyms =
        dymObjectCollerction .stream().filter(e -> e.getLong("parent") == 112l).collect(Collectors.toList());


//排序
DynamicObjectCollection dymObjectCollerction = this.getModel().getEntryEntity("单据体标识");
//按字段 menuindex 排序
Collections.sort(dymObjectCollerction , new Comparator<DynamicObject>(){
    @Override
    public int compare(DynamicObject stu1, DynamicObject stu2) {
        return stu1.getInt("menuindex")-stu2.getInt("menuindex");
    }

});


赞 5