卡片分录控件实现日历原创
金蝶云社区-生态
生态
16人赞赏了该文章 3765次浏览 未经作者许可,禁止转载编辑于2021年02月09日 10:23:47

通过本文章可以了解卡片分录的相关信息,如下:

     主要介绍苍穹卡片分录的使用,分录行批量新增、样式设置、行点击事件等


日历实现

最终效果图如下:

image.png

设计页面

  创建一个动态表单,添加一个卡片分录,使用文本控件,字段风格显示为标签,setvlaue时直接使用标识,不要直接使用标签控件。

image.png

插件代码

表单插件部分代码如下:

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、通过界面规则设置卡片分录的字段样式

image.png

image.png

效果如图:

image.png

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】

赞 16