解决doubleselect的doubleheadervalue不起作用

简介: 最近做J2EE项目,遇到这么一个问题,设备(device)在房间(room)里,房间在楼层(building)里,在添加设备(device)的时候,需要room和building的一个二级联动,通过查资料可以用ajax,s标签的doubleselect,我选择了后者,添加的时候没有遇到问题,顺利解决了问题,但是在我要修改device的信息的时候,我需要修改上面那个二级联动,doublese

最近做J2EE项目,遇到这么一个问题,设备(device)在房间(room)里,房间在楼层(building)里,在添加设备(device)的时候,需要room和building的一个二级联动,通过查资料可以用ajax,s标签的doubleselect,我选择了后者,添加的时候没有遇到问题,顺利解决了问题,但是在我要修改device的信息的时候,我需要修改上面那个二级联动,doubleselect自带的headervalue是可以用的,新增一个option,但是第二个select的初始值是不好用的,就是说doubleheadervalue是没办法正常达到我的需求的,百度,谷歌,csdn等等查了一些资料,都是再问问题却没有找到一个合理的解决方案。

开始的时候我想到了3种解决方案:

1.修改s标签的源码,DoubleListUIBean,DoubleSelect,AbstractDoubleListTag,DoubleSelectTag,还有几个vm文件,通过查看html源码和对应着java源码,.vm源码,想找到修改的方法,才疏学浅,没搞定……后面如果捣鼓清楚了,再回回来补充~

2.用JS页面上直接控制selected,尝试之后发现,第一个管用,第二个还是不管用,愁死了,可能需要继续优化~

3.通过对原理的理解,doubleselect的默认select都是第0位的option,原来用法是:

	//获取第一个select的list
    	buildingList = buildingService.findAll();
    	//组装map,组装第二个select
	map = new LinkedHashMap<Integer,List<Room>>(); 
	or(int i=0;i<buildingList.size();i++){
		Building building = buildingList.get(i);
		roomList = building.getRooms();
		map.put(building.getId(), roomList);
	}
当然所需要的get,set这里就不多说了,到页面上就是按照顺序,selected放在了第0位,这样的话,我要实现它的初始化就把device原来的room和building放在第0位就可以了,这里还应注意,buildinglist里device.room.device放在0位之后,map里的添加也要放在0位,然后是roomlist里的device.room放在0位,代码实现如下:

		device = deviceService.findById(entityId);
		buildingList = buildingService.findAll();
		//重组第一个select的list
		for(int i=0;i<buildingList.size();i++){
			if(device.getRoom().getBuilding() == buildingList.get(i)){
				buildingList.remove(i);
				buildingList.add(0, device.getRoom().getBuilding());
				break;
			}
		}
		//LinkedHashMap  插入顺序不变,不会按照key排序
		map = new LinkedHashMap<Integer,List<Room>>();
		//重组第二个select的list
		List<Room> roomList = device.getRoom().getBuilding().getRooms();
		for(int i=0;i<roomList.size();i++){
			if(device.getRoom() == roomList.get(i)){
				roomList.remove(device.getRoom());
				roomList.add(0,device.getRoom());
				break;
			}
		}
		
		map.put(device.getRoom().getBuilding().getId(), roomList);
		for(int i=0;i<buildingList.size();i++){
			if(device.getRoom().getBuilding().getId() == buildingList.get(i).getId()){

			}else{
				Building building = buildingList.get(i);
				roomList = building.getRooms();
				map.put(building.getId(), roomList);
			}
		}
		ActionContext.getContext().put("device", device);



我要修改的信息;


device详细信息,building和room已经初始化


相关文章
|
4月前
|
Android开发
setOnItemClickListener不起作用解决方法
setOnItemClickListener不起作用解决方法
32 2
|
4月前
|
开发工具
已设定选项 ‘readonly‘ (请加 ! 强制执行)
已设定选项 ‘readonly‘ (请加 ! 强制执行)
194 0
使用注释来阻止程序执行
使用注释来阻止程序执行
71 0
X11/XWindow更改属性代码
X11/XWindow更改属性代码
106 0
|
iOS开发
iOS开发- stringByReplacingOccurrencesOfString不起作用的坑
iOS开发- stringByReplacingOccurrencesOfString不起作用的坑
167 0
|
前端开发 JavaScript 开发者
一种有效的更改CSS样式方法
一种有效的更改CSS样式方法
126 0
一种有效的更改CSS样式方法
v-show不起作用
当v-show不起作用,很大一部分是因为该标签设置了display属性样式如display: flex,该样式的优先级高于v-show的display:none/display:block,导致v-show不起作用
367 0
【PhpStorm】设置代码自动折行
【PhpStorm】设置代码自动折行
223 0
【PhpStorm】设置代码自动折行
|
前端开发
SCSS 文件里的感叹号用法 - 给变量设置默认值
SCSS 文件里的感叹号用法 - 给变量设置默认值
SCSS 文件里的感叹号用法 - 给变量设置默认值
|
安全 Windows
ToolStripStatusLabel 没有 InvokeRequired 属性的解决办法
ToolStripStatusLabel 没有 InvokeRequired 属性的解决办法 当编写多线程程序时,你希望在线程中修改 Form 窗体上的控件的文本等属性, 但你会得到一个错误:线程间操作无效: 从不是创建控件“xxx”的线程访问它。
1639 0