昨天和今天早上,用DataSource从数据库后台动态加载数据,我的业务是这样的:

我有两个SelectItem选择框,第一个选择框里面的数据是单位,第二个选择框中的数据是对应单位的人,因为人可能有重名,所以还需要加载对应的人的其他信息(如身份证等等),来个图:

(选择好之后的样子)

第一个选择框中的单位变了,第二的选择框中只加载对应单位的人的数据,但是关键问题出来了,我加载的数据每一次都不会改变,不管第一个选择框的选择的是什么,第二个选择框只能加载一次数据,就是初始化那一次,我尝试了将对应的DataSource重新初始化,甚至写一个匿名的DataSource,问题都没有解决,最后在各种查文档、各种实践之后,我才发现,原来问题在于DataSource内的一个方法:setID(String id),只要id不变,不管你怎么折腾,数据还是那些数据,所以我果断将DataSource的id换了,奇迹就出现了,数据重新加载了,下面附上关键代码:

DataSource类:

public class TobaLeafGridFarmerInfoXmlDs extends DataSource {

private String townId=null;
private String villageId=null;
private static TobaLeafGridFarmerInfoXmlDs instance=null;

public static TobaLeafGridFarmerInfoXmlDs getInstance(String townId,String villageId){
if(instance==null){
instance=new TobaLeafGridFarmerInfoXmlDs("TobaLeafGridFarmerData",townId,villageId);
}
return instance;
}

public TobaLeafGridFarmerInfoXmlDs(String id,String townId,String villageId){
setTownId(townId);
setVillageId(villageId);
setID(id);//此处的id很重要的,相同的id返回的数据是一样的
setTitleField("farmerName");
setRecordXPath("/List/TobaLeafGridFarmerData");

DataSourceTextField townNameField = new DataSourceTextField("townName","乡镇",70,true);
DataSourceTextField villageIdField = new DataSourceTextField("villageId","村委会Id",30,true);
villageIdField.setHidden(true);
DataSourceTextField villageField = new DataSourceTextField("village","村委会",100,true);
DataSourceTextField farmerNameField = new DataSourceTextField("farmerName","烟农",50,true);
DataSourceTextField computerCodeField = new DataSourceTextField("computerCode","合同号",80,true);
DataSourceTextField IdCardField = new DataSourceTextField("idCard","身份证",80,true);

setFields(townNameField,villageIdField,villageField,farmerNameField,computerCodeField,IdCardField);
setDataFormat(DSDataFormat.XML);

//下面这个URL是一个Servlet的URL,数据来源是从数据库中取数的

setDataURL(HOST + "analyse/farmerDataServlet"+"?townId="+townId+"&villageId="+(villageId==null?"":villageId));
setClientOnly(true);
setCacheAllData(false);
}

public String getTownId() {
return townId;
}
public void setTownId(String townId) {
this.townId = townId;
}
public String getVillageId() {
return villageId;
}
public void setVillageId(String villageId) {
this.villageId = villageId;
}
}

选择框部分代码(selectVillage为第一个选择框,selectFarmer为第二个选择框,都是SelectItem实例):

DataSource farmerXmlDS=new TobaLeafGridFarmerInfoXmlDs(townId,townId,"");
final ListGrid pickListProperties = new ListGrid();
pickListProperties.setShowFilterEditor(true);
ListGridField townName = new ListGridField("townName",70);
ListGridField villageId = new ListGridField("villageId",30);
villageId.setHidden(true);
ListGridField village = new ListGridField("village",120);
ListGridField farmerName = new ListGridField("farmerName",50);
ListGridField computerCode = new ListGridField("computerCode",90);
ListGridField idCard = new ListGridField("idCard",120);
selectFarmer.setPickListFields(townName,villageId,village,farmerName,computerCode,idCard);
selectFarmer.setOptionDataSource(farmerXmlDS);
selectFarmer.setDisplayField("farmerName");
selectFarmer.setValueField("computerCode");
selectFarmer.setPickListWidth(460);
selectFarmer.setPickListProperties(pickListProperties);

selectVillage.addChangeHandler(new ChangeHandler() {
public void onChange(ChangeEvent event) {
String selectedVillageId = (String) event.getValue();
DataSource farmerXmlDS=new TobaLeafGridFarmerInfoXmlDs(
selectedVillageId==null?townId:selectedVillageId,townId,selectedVillageId);
selectFarmer.setOptionDataSource(farmerXmlDS);
selectFarmer.redraw();
}
});

servlet关键代码:

@Override
protected void service(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String xmlstring = "";
User user = WebRalasafe.getCurrentUser(request);
String townId=request.getParameter("townId");
String villageId=request.getParameter("villageId");
try {
xmlstring = getFarmerInfoXml(townId,villageId);
} catch (Exception e) {
e.printStackTrace();
}
response.setContentType("text/xml;charset=utf-8");
response.getWriter().write(xmlstring.toString());
}

public String getFarmerInfoXml(String townId,String villageId) throws Exception{

String farmerInfoXml="";
String sql="select …";    //sql略

List<String[]> result = xxx.QuerySql(sql);     //自己写的执行sql的方法

/*TobaLeafGridFarmerData是一个模型类(继承com.google.gwt.user.client.rpc.IsSerializable接口,可序列化),有一堆属性和对应getter和setter方法,没有其他多余的内容*/
List<TobaLeafGridFarmerData> datas=new ArrayList<TobaLeafGridFarmerData>();

for(int i=0;i<result.size();i++){
String tmp[]=result.get(i);
TobaLeafGridFarmerData data=new TobaLeafGridFarmerData();
data.setTownName(tmp[0]);
data.setVillageId(tmp[1]);
data.setVillage(tmp[2]);
data.setFarmerName(tmp[3]);
data.setComputerCode(tmp[4]);
data.setIdCard(tmp[5]);
datas.add(data);
}
String rootElement = "List";
boolean isOutputToFile = false;
String outFilePath = "";
farmerInfoXml = Xmloutput.object2Xml(rootElement, datas, isOutputToFile,
outFilePath);
return farmerInfoXml;
}

/*大概思路:首先DataSource(通过servlet)加载数据,同时要定义对应元数据(上面的是TobaLeafGridFarmerData),然后SelectItem再调用这个DataSource,就这样*/

smartGWT DataSource数据动态加载的更多相关文章

  1. Echarts使用及动态加载图表数据 折线图X轴数据动态加载

    Echarts简介 echarts,缩写来自Enterprise Charts,商业级数据图表,一个纯JavaScript的图表库,来自百度...我想应该够简洁了 使用Echarts 目前,就官网的文 ...

  2. 将数据动态加载到Echarts饼图中

    需求描述 Echarts中的官方示例是将数据的设定写好在页面的配置项中的,但在实际的开发展示中,我们需要按照需求通过调用后台的接口获取数据,再将数据加载到特定的Echarts饼图中. 实现效果 实现步 ...

  3. [安卓] 9、线程、VIEW、消息实现从TCP服务器获取数据动态加载显示

    一.前言: 一般情况下从TCP服务器读取数据是放在一个线程里读的,但是刷新界面又不得不放在线程外面,所以需要用消息传递把线程里从TCP里获得的数据传送出来,然后根据数据对页面进行相应的刷新. 二.业务 ...

  4. Echarts动态加载后台数据

    注意:1.用Ajax请求获取后台数据 2.Echarts只能处理Json数据 后台Controller:根据业务需求不同而返回不同数据,我前台要循环遍历Echarts的series进行数据添加,所以后 ...

  5. 动态加载DataGrid表头及数据

    初始化表头 js生成前端 /*初始化表头*/ function initDataGridTitle(id) { $.ajax({ url: '/${appName}/report/***/***', ...

  6. AJAX 动态加载后台数据 绑定select

    <select id="select"> <!--下拉框数据动态加载--> </select> js:(使用jquery) $(document ...

  7. OpenLayers学习笔记(十)— 动态加载JSON数据模拟航迹线

    在openlayers 3 上,加载本地json数据,动态绘制航迹线,以飞机当前位置为地图中心,此例子是模拟DEMO 本文链接:动态加载JSON数据模拟航迹线 作者:狐狸家的鱼 GitHub:八至 前 ...

  8. 在aspx页动态加载ascx页面内容,给GridView控件绑定数据

    在aspx页动态加载ascx页面内容 //加载ascx页面内容Control c1 = this.Page.LoadControl("WebUserControl1.ascx"); ...

  9. geotrellis使用(二十三)动态加载时间序列数据

    目录 前言 实现方法 总结 一.前言        今天要介绍的绝对是华丽的干货.比如我们从互联网上下载到了一系列(每天或者月平均等)的MODIS数据,我们怎么能够对比同一区域不同时间的数据情况,采用 ...

随机推荐

  1. 微信小程序开发之http到https的转化

    小程序从公布到现在已经过去好几个月了,本来从小程序发布出来就准备抱着微信的大腿进行一波小程序开发的,但是由于公司项目小程序暂时不支持,也就只能一直搁浅.过年过来偶然和朋友谈起小程序,觉的工作再忙也得找 ...

  2. c++编程思想(一)--对象导言

    回过头来看c++编程思想第一章,虽然只是对c++知识的一个总结,并没有实质性知识点,但是收获还是蛮多的! 下面感觉是让自己茅塞顿开的说法,虽然含义并不是很准确,但是很形象(自己的语言): 1.类描述了 ...

  3. esri-leaflet入门教程(4)-加载各类图层

    esri-leaflet入门教程(4)-加载各类图层 by 李远祥 在leaflet中图层一般分为底图(Basemap)和叠加图层(Overlay).前面章节已经介绍过底图其实也是实现了TileLay ...

  4. centos安装UCenter 和 UCenter_Home

    1.搭建lamp环境yum  –y  install  httpd  php  php-mysql  mysql  mysql-server 2启动服务   3.设置服务开机自动启动 4.上传UCEN ...

  5. 纪中集训 Day 8 & Last Day

    好吧回到家一直玩到现在才来写冏= = 然后今天终于在最后一场比赛中AK了= = 虽然有两人AK,另一个是初二牛ORZ 其实都是水题+模板题 第一题是DP,第二题是模拟,第三题是可持久化TREAP(其实 ...

  6. JavaScript 基本类型值-Undefined、Null、Boolean

    ▓▓▓▓▓▓ 大致介绍 ECMAScript中有5中简单的数据类型(也称为基本数据类型):Undefined.Null.Boolean.Number.String. ▓▓▓▓▓▓ Undefined ...

  7. 推荐一款好用的WSL终端模拟器

    Windows 10 中包含了一个 WSL(Windows Subsystem for Linux)子系统,我们可以在其中运行未经修改过的原生 Linux ELF 可执行文件.利用它我们可以做很多事情 ...

  8. Android Realm数据库使用指南

    Android Realm数据库使用指南 Realm数据库, 目前有Java, Objective‑C, React Native, Swift, Xamarin的几种实现, 是一套用来取代SQLit ...

  9. MYSQL中添加时间

    1.在创建新记录和修改现有记录的时候都对这个数据列刷新:TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 2.在创建新记录 ...

  10. Cocos2d-x中的CC_CALLBACK_X详解

    Cocos2d-x 3.x版本用CC_CALLBACK_0,CC_CALLBACK_1,CC_CALLBACK_2和CC_CALLBACK_3的宏来定义回调方法类的. 3.x版本的例子: child- ...