通过本文章可以了解卡片分录的相关信息,如下:
主要介绍苍穹卡片分录的使用,分录行批量新增、样式设置、行点击事件等
日历实现
最终效果图如下:
设计页面
创建一个动态表单,添加一个卡片分录,使用文本控件,字段风格显示为标签,setvlaue时直接使用标识,不要直接使用标签控件。
插件代码
表单插件部分代码如下:
package kd.bos.kdec.control.entrycard;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.EventObject;
import kd.bos.dataentity.utils.StringUtils;
import kd.bos.entity.datamodel.IDataModel;
import kd.bos.entity.datamodel.events.PropertyChangedArgs;
import kd.bos.form.plugin.AbstractFormPlugin;
import kd.bos.kdec.control.entrycard.helper.CalendarHelper;
public class CalendarFormPlugin extends AbstractFormPlugin{
//单据体标识
private final static String KEY_ENTRY_CARD = "kdec_entryentity";
//数字月份标识
private final static String KEY_MONTH_NUM = "kdec_monthnum";
//英文月份标识
private final static String KEY_MONTH_ENG = "kdec_montheng";
@Override
public void propertyChanged(PropertyChangedArgs e) {
// TODO Auto-generated method stub
super.propertyChanged(e);
String name = e.getProperty().getName();
if(StringUtils.equals(name, "kdec_datefield")) {
Date date = (Date) this.getModel().getValue("kdec_datefield");
//获取年份
int year = getYear(date);
//创建卡片分录
IDataModel model = this.getModel();
//切换年份时,清空单据体数据
model.deleteEntryData(KEY_ENTRY_CARD);
//先创建分录行,否则设置值时报错
model.batchCreateNewEntryRow(KEY_ENTRY_CARD, 12);
for (int i = 1; i <= 12; i++) {
if(i>=10) {
model.setValue(KEY_MONTH_NUM, i,i-1);
}else {
model.setValue(KEY_MONTH_NUM, "0"+i,i-1);
}
model.setValue(KEY_MONTH_ENG, CalendarHelper.getMonthName(i), i-1);
printDays(model, year, i);
}
}
}
@Override
public void beforeBindData(EventObject e) {
// TODO Auto-generated method stub
super.beforeBindData(e);
Date date = (Date) this.getModel().getValue("kdec_datefield");
//获取年份
int year = getYear(date);
//创建卡片分录
IDataModel model = this.getModel();
model.batchCreateNewEntryRow(KEY_ENTRY_CARD, 12);
for (int i = 1; i <= 12; i++) {
if(i>=10) {
model.setValue(KEY_MONTH_NUM, i,i-1);
}else {
model.setValue(KEY_MONTH_NUM, "0"+i,i-1);
}
model.setValue(KEY_MONTH_ENG, CalendarHelper.getMonthName(i), i-1);
printDays(model, year, i);
}
}
private void printDays(IDataModel model,int year,int month) {
int startDay = CalendarHelper.getStartDay(year, month);
//日期类需要自己实现
int monthDays = CalendarHelper.getNumberOfDaysInMonth(year, month);
for (int i = 1; i <= monthDays; i++) {
int label = i+startDay;
// 文本控件标识设置要有规律
model.setValue("kdec_day_"+label, i, month-1);
}
}
private int getYear(Date date) {
//格式化展示日期控件
SimpleDateFormat y = new SimpleDateFormat("yyyy");
String year = y.format(date);
return Integer.parseInt(year);
}
}
卡片分录样式设置
1、通过界面规则设置卡片分录的字段样式
效果如图:
2、插件代码实现卡片分录某一个卡片的字段样式
private void setRowCellStyle(String key, int row) {
CardEntry cardEntry = this.getView().getControl(KEY_ENTRY_CARD);
//结果必须正确,否则不生效
Map<String, Object> map_textfield = new HashMap<>(1);
Map<String, Object> prop_textfield = new HashMap<>(1);
//背景颜色
prop_textfield.put(ClientProperties.BackColor, "#44cef6");
//前景颜色
prop_textfield.put(ClientProperties.ForeColor, "#ffffff");
map_textfield.put(key, prop_textfield);
//此方法只设置一些样式属性,不能圆角半径等属性
cardEntry.setCustomProperties(cardEntry.getKey(), row, map_textfield);
}
卡片分录的行点击和单元格点击
场景:点击一个卡片,需要实现行点击事件,弹出每个月的日程,点击单元格弹出当天的日程信息
实现接口
public class CalendarFormPlugin extends AbstractFormPlugin implements RowClickEventListener
在方法监听行点击和单元格点击
@Override
public void registerListener(EventObject e) {
// TODO Auto-generated method stub
super.registerListener(e);
CardEntry cardEntry = this.getView().getControl(KEY_ENTRY_CARD);
cardEntry.addRowClickListener(this);
}
实现对应方法
@Override
public void entryRowClick(RowClickEvent evt) {
// TODO Auto-generated method stub
RowClickEventListener.super.entryRowDoubleClick(evt);
CardEntry cardEntry = (CardEntry) evt.getSource();
if (StringUtils.equals(KEY_ENTRY_CARD, cardEntry.getKey())){
}
}
【emoji】
推荐阅读