FieldGroup可以直接绑定一个数据源DataSource。但如果想绑定某个值,并没有直接作为数据库中的一个字段存在。而是最后转为json串保存在数据库中。这样的话相当于key-value模式的DataSource,这里是ItemDataSource。

为FieldGroup绑定一个日期控件

//首先得在FieldGroup添加这个Item
PropertysetItem item = new PropertysetItem();
item.addItemProperty("{code_act_Date1}",new ObjectProperty(""));
FieldGroup fieldGroup = new FieldGroup(item); //然后再进行定义日期控件
WebGridLayout actGrid = componentsFactory.createComponent(WebGridLayout.class);
DateField dateField = new DateField();
dateField.setDateFormat("yyyy年MM月dd日"); //进行绑定
fieldGroup.bind(dateField, actElements.get(i).getValue()); //将日期控件添加到页面中
GridLayout tmpGgridLayout = (GridLayout) actGrid.getComponent();
tmpGgridLayout.addComponent(dateField);

PS:item.addItemProperty("{code_act_Date1}",new ObjectProperty(""));这句话为什么不是item.addItemProperty("{code_act_Date1}",new DateField());

参见:http://www.cnblogs.com/acm-bingzi/p/cubaFieldGroupDate.html

PPS:悲了个剧的,最后发现new ObjectProperty("")) 这种方法在某些服务器上会Date类型转换报错,所以这里还是应该使用 new DateField())

一种类型转换错误的情况ClassCastException

刚开始使用以下方式fieldGroup绑定

WebGridLayout actGrid = componentsFactory.createComponent(WebGridLayout.class);
WebDateField webDateField = componentsFactory.createComponent(WebDateField.class);
webDateField.setDateFormat("yyyy年MM月dd日");
fieldGroup.bind((DateField)webDateField.getComponent(), nameValueElements.get(i).getValue());
actGrid.add(webDateField);

报错:ClassCastException: com.haulmont.cuba.web.toolkit.ui.CubaDateFieldWrapper cannot be cast to com.vaadin.ui.DateField

这个错真是很奇怪,但是上面那种把WebGridLayout 转换成GridLayout 就没有问题

将FieldGroup中的数据转换成json串保存

//...
FieldGroup fieldGroup = new FieldGroup(item);
Map<String, Object> mapValues = new HashMap<>();
Collection<String> itemIds = (Collection<String>) item.getItemPropertyIds();
for (String itemId : itemIds) {
Object object = fieldGroup.getItemDataSource().getItemProperty(itemId).getValue();
String value = null;
if (object != null) {
value = fieldGroup.getItemDataSource().getItemProperty(itemId).getValue().toString();
}
mapValues.put(itemId, value);
} ObjectMapper mapper = new ObjectMapper();
//转JSON
String json = mapper.writeValueAsString(mapValues);

最后json的值的格式是:

  {"{code_10_13}":"123","{code_10_15}":"接地电阻值满足要求","{code_7_6}":"智能建筑-防雷与接地"}

再将json值保存到数据库中的一个字段

将json串中的数据转换到FieldGroup中

//简单写法:
//这个方法里的两个参数,第一个是(PropertysetItem)fieldGroup.getItemDataSource(),第二个是json值
void setSavedPropertyValues(PropertysetItem propertysetItem, String jsonValue) {
Map<String, Object> mapValues = getSavedValue(jsonValue);
if (mapValues != null) {
for (String key : mapValues.keySet()) {
if (propertysetItem.getItemProperty(key) != null) {
propertysetItem.getItemProperty(key).setValue(mapValues.get(key));
}
}
}
} //将json转换成ap类型
Map<String, Object> getSavedValue(String jsonValue) {
if (jsonValue == null || jsonValue.isEmpty()) {
return null;
}
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> mapValues = null;
try {
mapValues = objectMapper.readValue(jsonValue, Map.class);
} catch (IOException e) {
throw new IllegalArgumentException("已保持的值格式错误,无法解析成map对象");
}
return mapValues;
}

PS:如果最上边添加日期控件的时候,使用的是 item.addItemProperty("{code_act_Date1}",new DateField());

那么这段代码应该稍微增加一点,如下:

void setSavedPropertyValues(PropertysetItem propertysetItem, String jsonValue) {
Map<String, Object> mapValues = getSavedValue(jsonValue);
if (mapValues != null) {
for (String key : mapValues.keySet()) {
if (propertysetItem.getItemProperty(key) != null) {
if (propertysetItem.getItemProperty(key).getType() == Date.class) {
Date date = new Date((String) mapValues.get(key));
propertysetItem.getItemProperty(key).setValue(date);
} else {
propertysetItem.getItemProperty(key).setValue(mapValues.get(key));
}
}
}
}
}

FieldGroup绑定ItemDataSource的更多相关文章

  1. FieldGroup绑定的日期类型存储格式的问题

    问题 日期存储的时候,当前数据库中存储格式为 "2017-9-5 0:00:00", 而我实现了以后,看到数据库的存储格式为 "Mon Sep 04 00:00:00 C ...

  2. Windows Store App JavaScript 开发:模板绑定

    WinJS库模板提供了一种格式化显示多条数据的便捷方式,通过这种方式可以将模板与ListView或FlipView等控件结合使用以控制数据的显示格式.定义一个WinJS库模板的方法与定义WinJS库控 ...

  3. Win10系列:JavaScript 模板绑定

    WinJS库模板提供了一种格式化显示多条数据的便捷方式,通过这种方式可以将模板与ListView或FlipView等控件结合使用以控制数据的显示格式.定义一个WinJS库模板的方法与定义WinJS库控 ...

  4. ASP.NET Core MVC/WebAPi 模型绑定探索

    前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...

  5. MVVM设计模式和WPF中的实现(四)事件绑定

    MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  6. MVVM模式解析和在WPF中的实现(三)命令绑定

    MVVM模式解析和在WPF中的实现(三) 命令绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  7. 冒泡,setinterval,背景图的div绑定事件,匿名函数问题

    1.会冒泡到兄弟元素么? $(function(){ $("#a").click(function(){alert("a")}) $("#b" ...

  8. Xamarin+Prism开发详解二:Xaml文件如何简单绑定Resources资源文件内容

    我们知道在UWP里面有Resources文件xxx.resx,在Android里面有String.Xml文件等.那跨平台如何统一这些类别不一的资源文件以及Xaml设计文件如何绑定这些资源?应用支持多国 ...

  9. 数据的双向绑定 Angular JS

    接触AngularJS许了,时常问自己一些问题,如果是我实现它,会在哪些方面选择跟它相同的道路,哪些方面不同.为此,记录了一些思考,给自己回顾,也供他人参考. 初步大致有以下几个方面: 数据双向绑定 ...

随机推荐

  1. 安全提示:IIS不要开启“WebDAV”扩展(转载)

    在IIS设置里,有一个“Web服务扩展”的设置,其中包括“WebDAV”扩展.许多人都不明白,这个“WebDAV”扩展是干嘛用的,要不要开启呢?有不少人的想法是“开启吧,以免影响网站运行,启用总比不启 ...

  2. Luogu3514 POI2011 Lollipop 递推、构造

    题目传送门:https://www.luogu.org/problemnew/show/P3514 题意:给出一个只有$1$和$2$的长度为$N$的数列,$M$次询问是否存在一段连续子区间和为$K$. ...

  3. SPOJ33&POJ1934 Trip LCS

    题目传送门:https://www.luogu.org/problemnew/show/SP33 题目大意:给出两个字符串,求其LCS(最长公共子序列)的长度与具体方案(相同的串算作同一方案).数据组 ...

  4. redis 配置 架构 基础

    redis 官网  redis.io   io为某国家域名后缀 有redis各种版本. java 版本 又分各种工具 clients 下 RedisClient为图形化管理界面 Jedis 才是jav ...

  5. 大数据处理过程核心技术ETL详细介绍

    架构挑战 1.对现有数据库管理技术的挑战. 2.经典数据库技术并没有考虑数据的多类别(variety).SQL(结构化数据查询语言),在设计的一开始是没有考虑到非结构化数据的存储问题. 3.实时性技术 ...

  6. Jmeter(二十九)_dotnet搭建本地接口服务

    这里使用的服务名为Bookshelf,在github上,自行下载.要运行此服务,需要.Net Core SDK 2.1或更高版本.如果尚未安装,从.Net Core官方网站下载并安装. 在本地克隆项目 ...

  7. Docker网络解决方案 - Flannel部署记录

    Docker跨主机容器间网络通信实现的工具有Pipework.Flannel.Weave.Open vSwitch(虚拟交换机).Calico, 其中Pipework.Weave.Flannel,三者 ...

  8. Linux内核设计第十七章笔记

    第十七章 设备与模块 关于设备驱动和设备管理,四种内核成分 设备类型:在所有unix系统中为了统一普通设备的操作所采用的分类 模块:Linux内核中用于按需加载和卸载目标代码的机制 内核对象:内核数据 ...

  9. 《Linux内核分析与实现》 第五周 读书笔记

    第3章 进程管理 20135307张嘉琪 3.1 进程 进程就是处于执行期的程序(目标码存放在某种存储介质上),但进程并不仅仅局限于一段可执行程序代码.通常进程还要包含其他资源,像打开的文件,挂起的信 ...

  10. 解决AJAX session跨域失效

    1.想实现的功能是登录时有个验证码,这个验证码后台提供,然后放在session中,前台把用户输入的验证码通过AJAX发给后台,后台把session中的验证码取出来然后比较不同,一样则通过. 问题出现在 ...