第一步:建立bean类,
bean类
@Entity
@Table(name = "MCC")//数据库表名:MCC
public class MCC {
private String id;
private String shlb;// 商户类别
private String lbjb;// 类别级别 1大类别 2 小类别 3商户类别名
private String sslb;// 所属类别
private String sxf;// 手续费
private String mcc;// mcc值
private String zt;// 状态
private String lrr; // 录入人
private String lrsj; // 录入时间
private String xgr; // 修改人
private String xgsj; // 修改时间
@Id//设置主键
@Column(length = 15)//设置列
public String getId() {
return id;
}
@Column(length = 150)
public String getShlb() {
return shlb;
}
@Column(length = 3)
public String getLbjb() {
return lbjb;
}
@Column(length = 100)
public String getSslb() {
return sslb;
}
@Column
public String getSxf() {
return sxf;
}
@Column(length = 15)
public String getMcc() {
return mcc;
}
@Column(length = 1)
public String getZt() {
return zt;
}
@Column(length = 20)
public String getLrr() {
return lrr;
}
@Column(length = 20)
public String getLrsj() {
return lrsj;
}
@Column(length = 20)
public String getXgr() {
return xgr;
}
@Column(length = 20)
public String getXgsj() {
return xgsj;
}
省略set方法
2.页面显示的bean
pagebean
public class MccTreeGrid {
private String id;
private String shlb;
private String sxf;
private String mcc;
private String lbjb;
private String zt;
private String lrr;
private String lrrmc;
private String lrsj;
private String xgr;
private String xgrmc;
private String xgsj;
private String sslb;
private String state = "open";// open,closed异步加载必须添加该项
private List<MccTreeGrid> children;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getShlb() {
return shlb;
}
public void setShlb(String shlb) {
this.shlb = shlb;
}
public String getSxf() {
return sxf;
}
public void setSxf(String sxf) {
this.sxf = sxf;
}
public String getMcc() {
return mcc;
}
public void setMcc(String mcc) {
this.mcc = mcc;
}
public String getZt() {
return zt;
}
public void setZt(String zt) {
this.zt = zt;
}
public String getLrr() {
return lrr;
}
public void setLrr(String lrr) {
this.lrr = lrr;
}
public String getLrsj() {
return lrsj;
}
public void setLrsj(String lrsj) {
this.lrsj = lrsj;
}
public String getXgr() {
return xgr;
}
public void setXgr(String xgr) {
this.xgr = xgr;
}
public String getXgsj() {
return xgsj;
}
public void setXgsj(String xgsj) {
this.xgsj = xgsj;
}
public List<MccTreeGrid> getChildren() {
return children;
}
public void setChildren(List<MccTreeGrid> children) {
this.children = children;
}
public String getLbjb() {
return lbjb;
}
public void setLbjb(String lbjb) {
this.lbjb = lbjb;
}
public String getSslb() {
return sslb;
}
public void setSslb(String sslb) {
this.sslb = sslb;
}
public String getLrrmc() {
return lrrmc;
}
public void setLrrmc(String lrrmc) {
this.lrrmc = lrrmc;
}
public String getXgrmc() {
return xgrmc;
}
public void setXgrmc(String xgrmc) {
this.xgrmc = xgrmc;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
3.接口实现类(省略接口类及dao层)
serviceImpl
/**
* 获取treegrid列表
* */
@Transactional(propagation = Propagation.SUPPORTS)
public List<MccTreeGrid> treegrid(Mcc mcc) {
String hql = "from MCC t where 1 = 1 and t.lbjb = 1 ";
List<Object> values = new ArrayList<Object>();
hql = addWhere(mcc, hql, values);
List<MCC> t = dao.find(hql,values);
List<MccTreeGrid> treegrid = new ArrayList<MccTreeGrid>();
for(MCC m:t){
treegrid.add(treegrid(m));
}
return treegrid;
}
/**
* treegrid
* */
private MccTreeGrid treegrid(MCC m){
MccTreeGrid t = new MccTreeGrid();
t.setId(m.getId());
t.setShlb(m.getShlb());
t.setSxf(m.getSxf());
t.setMcc(m.getMcc());
t.setLbjb(m.getLbjb());
t.setLrr(m.getLrr());
t.setLrsj(m.getLrsj());
t.setXgr(m.getXgr());
t.setXgsj(m.getXgsj());
t.setZt(m.getZt());
t.setSslb(m.getSslb());
t.setLrrmc(udao.get("from Tuser e where e.id = ? ", new Object[]{m.getLrr()}).getUsername());
if(m.getXgr() != null && !"".equals(m.getXgr())){
t.setXgrmc(udao.get("from Tuser e where e.id = ? ", new Object[]{m.getLrr()}).getUsername());
}
List<MCC> l = dao.find("from MCC t where t.sslb = ? ", new Object[]{m.getId()});
if(l.size() > 0){
t.setState("closed");
}else{
t.setState("open");
}
List<MccTreeGrid> children = new ArrayList<MccTreeGrid>();
for(MCC c:l){
MccTreeGrid tg = new MccTreeGrid();
tg.setId(c.getId());
tg.setShlb(c.getShlb());
tg.setSxf(c.getSxf());
tg.setMcc(c.getMcc());
tg.setLbjb(c.getLbjb());
tg.setLrr(c.getLrr());
tg.setLrsj(c.getLrsj());
tg.setXgr(c.getXgr());
tg.setXgsj(c.getXgsj());
tg.setZt(c.getZt());
tg.setSslb(c.getSslb());
children.add(treegrid(c));
}
t.setChildren(children);
return t;
}
4.anction的实现方法
action
/**
* 获取treegrid
* */
public void treegrid(){
super.writeJson(ms.treegrid(mcc));
}
5.js页面
treegrid = $('#mcc_manage_treegrid').treegrid({
url : dylan.bp() + '/mcc!treegrid.action',
method: 'POST',
pagination : false,
rownumbers:false,
fit : true,//自适应
fitColumns : true,
queryParams:dylan.serializeObject(searchForm),
nowrap : false,//单元格内容自动换行
animate : true,
collapsible: true,
border : false,//无边框
idField : 'id',//记录主键,可不写
treeField:'shlb',
columns : [ [ {//锁定列
field : 'id',
title : '主键',
width : 100,
checkbox : true
}, {
field : 'shlb',
title : '商户类别',
width : 480,
align : 'left'
},{
field : 'sxf',
title : '手续费',
width : 80,
sortable : true,
align : 'center'
}, {
field : 'mcc',
title : 'mcc值',
width : 80,
sortable : true,
align : 'center'
}, {
field : 'zt',
title : '状态',
width : 80,
sortable : true,
align : 'center',
formatter : function(v) {
if (v == '0') {
return '无效';
}
return '有效';
}
}, {
field : 'lrrmc',
title : '录入人',
width : 80,
align : 'center'
}, {
field : 'lrsj',
title : '录入时间',
width : 130,
align : 'center'
}, {
field : 'xgrmc',
title : '修改人',
width : 80,
align : 'center'
}, {
field : 'xgsj',
title : '修改时间',
width : 130,
align : 'center'
}
] ],
//treegrid异步查询
onBeforeLoad:function(row,param){
if(row){
$(this).treegrid('options').url =dylan.bp() + '/mcc!treegrid.action?sslb='+row.id;
}else{
$(this).treegrid('options').url =dylan.bp() + '/mcc!treegrid.action';
}
},
onExpand : function(row) {
treegrid.treegrid('unselectAll');
},
onCollapse : function(row) {
treegrid.treegrid('unselectAll');
},
onContextMenu : function(e,row){
e.preventDefault();//阻止向上冒泡
$(this).treegrid('select', row.id);
$('#menu').menu('show',{
left: e.pageX,
top: e.pageY
});
},
toolbar:[{
iconCls:'icon-search',
text : '查询',
handler:function(){
dylan.mcc_manage.searchForm();
}
},'-',{
iconCls:'icon-add',
text : '添加',
handler:function(){
dylan.mcc_manage.add();
}
},'-',{
iconCls:'icon-edit',
text : '修改',
handler:function(){
dylan.mcc_manage.edit();
}
},'-',{
iconCls:'icon-remove',
text : '更改状态',
handler:function(){
dylan.mcc_manage.remove();
}
},'-',{
iconCls:'icon-add',
text : '展开',
handler:function(){
dylan.mcc_manage.expand();
}
},'-',{
iconCls:'icon-remove',
text : '收起',
handler:function(){
dylan.mcc_manage.collapse();
}
},'-']
});
总结:
编写过程中存在的问题:
1.treegrid的异步查询,
解决步骤 1.在pagebean的类里面添加state属性,默认为close
2.在impl接口里面判断是否有子节点,并设置state相对应的值
if(l.size() > 0){//l为获取子节点的列表
t.setState("closed");//若l不为空,则设置state为closed
}else{
t.setState("open");
}
3.修改js文件,设置onBeforeLoad方法,(不能设置onBeforeExpand,否则在添加和修改子节点时,reload方法会导致页面所有元素加载为空)
onBeforeLoad:function(row,param){
if(row){
$(this).treegrid('options').url =dylan.bp() + '/mcc!treegrid.action?sslb='+row.id;
}else{
$(this).treegrid('options').url =dylan.bp() + '/mcc!treegrid.action';
}
},