昨天和今天早上,用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. typedef struct 是什么意思

    typedef用于定义一种新类型例如定义了如下的结构typedef struct student{int age;int score;}STUDENT;那么则有STUDENT stu1;就相当于str ...

  2. CentOS 7 yum搭建 LAMP

    CentOS 7 搭建LAMP环境 1. Apache 安装 Apache 的软件包名称叫做httpd,因此安装Apache,使用以下命令 [root@localhost ~]# yum -y ins ...

  3. 分布式配置管理--百度disconf搭建过程和详细使用

    先说官方文档:http://disconf.readthedocs.io/zh_CN/latest/index.html 不管是否要根据官方文档来搭建disconf,都应该看一下这一份文档.精炼清晰地 ...

  4. input输入自动大写

    方法1:使用JS <input name="text" type="text" onkeyup="this.value=this.value.t ...

  5. ASP.NET Core MVC上传、导入、导出知多少

    前言 本君已成夜猫子,本节我们来讲讲ASP.NET Core MVC中的上传,这两天才研究批量导入功能,本节顺便简单搞搞导入.导出,等博主弄妥当了再来和大家一并分享. .NET Core MVC上传 ...

  6. Cocos2dx热更新遇到的那些坑

    1.Cocos2dx热更新因为文件名含有空格,ios下载失败bug修改 问题描述: 项目中偶尔遇到美术图片命名时不规范,导致图片名字含有空格.导致ios热更新时,遇到下载失败. 解决方案: 1.从新改 ...

  7. 微软.NET年芳15:我在Azure上搭建Photon服务器(C#.NET)

    网上火热的“微软.NET年芳15”文章,我也得写点什么嘛,毕竟我还是现任的微软MVP. 摘录网上的“.NET 15周年”信息如下: 微软的 .NET 框架本周迎来了 15 岁生日..NET 的第一个版 ...

  8. 两款【linux字符界面下】显示【菜单】,【选项】的powershell脚本模块介绍

    两款[linux字符界面下]显示[菜单],[选项]的powershell脚本模块介绍 powershell linux  ps1 menu choice Multiselect 传教士 菜单 powe ...

  9. TypeScript设计模式之单例、建造者、原型

    看看用TypeScript怎样实现常见的设计模式,顺便复习一下. 单例模式 Singleton 特点:在程序的生命周期内只有一个全局的实例,并且不能再new出新的实例. 用处:在一些只需要一个对象存在 ...

  10. Git如何检出指定目录或文件

    系统版本:Window 10,Git 版本:2.7.1 对于大型 Git 仓库,每次执行 Git 命令,都需要经过漫长的等待,特别是要经常执行的 git status 命令.下面是一个例子... 从 ...