extjs动态树 动态grid 动态列

由于项目需要做一个动态的extjs树、列等等,简而言之,就是一个都是动态的加载功能,

自己琢磨了半天,查各种资料,弄了将近两个星期,终于做出来了

首先,想看表结构,我的这个功能需要主从两张表来支持

代码目录表:


CREATE TABLE SYS_T01_CODECONTENT
(
ID NUMBER NOT NULL,
PID NUMBER NOT NULL,
TABLENAME VARCHAR2(50 BYTE),
ZH_CN VARCHAR2(200 BYTE),
ENABLE CHAR(1 BYTE)
);

代码结构表:


CREATE TABLE FTGM.SYS_T01_CODESTRUCT
(
ID NUMBER,
TABLENAME VARCHAR2(20 BYTE),
COLUMNS VARCHAR2(20 BYTE),
ZH_CN VARCHAR2(20 BYTE),
ENABLE CHAR(1 BYTE),
PRECISION NUMBER,
TYPE VARCHAR2(20 BYTE)
);

然后是程序部分了,

最开始先加载一个树


<script>
Ext.onReady(function () {
Ext.BLANK_IMAGE_URL = ‘Scripts/ExtJS/resources/images/default/s.gif‘;
Ext.QuickTips.init();
//异步加载根节点
var root = new Ext.tree.AsyncTreeNode({
text: ‘所有表‘,
draggable: false,
id: ‘0‘
});
//加载数据
var treeloader = new Ext.tree.TreeLoader({
dataUrl: ‘CodeManager.aspx?opt=GetTree‘
});
//树
var tree = new Ext.tree.TreePanel({
rootVisible: true,
layout: ‘fit‘,
width: document.documentElement.clientWidth * 0.2,
height: document.documentElement.clientHeight,
autoScroll: true,
renderTo: ‘tree‘,
animate: true,
enableDD: false,
title: ‘代码目录表‘,
root: root,
loader: treeloader
});
//双击事件
tree.on("dblclick", function (node) {
//节点ID
node = node.id;
//全局变量
var data;
//grid中取出的字段对象
var field = Array();
//form表单item
var items = ‘‘;
var value = ‘‘;
var params = ‘‘;
var rowVal = ‘‘;
//添加动态列 这里才是加载动态grid的关键
var addColumn = function () {
this.fields = ‘‘; //列文件解析对象
this.columns = ‘‘; //列文件列头对象
this.addColumns = function (name, caption) { //私有函数
if (this.fields.length > 0) {
this.fields += ‘,‘;
}
if (this.columns.length > 0) {
this.columns += ‘,‘;
}
this.fields += ‘{name:"‘ + name + ‘"}‘;
this.columns += ‘{header:"‘ + caption + ‘",dataIndex:"‘ + name + ‘",width:100,sortable:true}‘;
};
};

var createGrid = function () {
//赋值给列
var cm = new Ext.grid.ColumnModel(eval(‘([‘ + data.columns + ‘])‘));
//默认排序
cm.defaultSortable = true;
//数据字段
var fields = eval(‘([‘ + data.fields + ‘])‘);
//加载数据源
var store = new Ext.data.Store({
proxy: new Ext.data.HttpProxy({
method: ‘GET‘,
url: "CodeManager.aspx?opt=GetData&&node=" + node + ""
}),
reader: new Ext.data.JsonReader({
totalProperty: "total",
root: "rows",
fields: fields,
successProperty: ‘success‘
})
});
//重新加载数据
store.load({ params: { start: 1, limit: 20} });
//分页工具栏
var pagingBar = new Ext.PagingToolbar({
displayInfo: true,
emptyMsg: "没有数据显示",
displayMsg: "显示从{0}条数据到{1}条数据,共{2}条数据",
store: store,
pageSize: 20
});

});
</script>

在树的代码部分加载grid


  var grid = new Ext.grid.GridPanel({
title: "代码结构表",
cm: cm,
id: "content_panel",
renderTo: "content",
frame: true,
border: true,
layout: "fit",
width: document.documentElement.clientWidth * 0.8,
height: document.documentElement.clientHeight,
store: store,
pageSize: 20,
viewConfig: {
forceFit: true
},
bbar: pagingBar,
tbar: [
{
text: ‘新增‘,
id: ‘btn_add‘,
iconCls: ‘newIcon‘,
handler: function Add() {
$("#win_new").html("");
items = "";
for (var i = 0; i < grid.colModel.config.length; i++) {
field = grid.colModel.config[i];
items += "{fieldLabel: ‘" + field.header + "‘,name: ‘" + field.dataIndex + "‘,id: ‘" + field.dataIndex + "‘,width: 180},";
}
//截取以逗号结尾之前的部分
items = "[" + items.substring(0, items.lastIndexOf(‘,‘)) + "]";
//将字符串转换成JSON对象
items = eval(items);
//新增表单
var form = new Ext.form.FormPanel({ //创建表单面板
labelAlign: ‘center‘, //水平对齐方式
layout: ‘form‘, //布局模式
id: ‘form_xg‘, //设置ID
labelWidth: 100, //宽度
frame: true, //是否显示frame
defaultType: ‘textfield‘, //默认文本类型
defaults: { allowBlank: false }, //默认是否允许为空
autoHeight: true, //自适应高度
autoWidth: true, //自适应宽度
bodyStyle: ‘padding:0 0 10px 30px;‘, //设置窗体样式
items: items
});

//新增窗体
var win_new = new Ext.Window({
el: ‘win_new‘,
layout: ‘form‘,
resizable: false,
title: ‘<center>新增代码结构</center>‘,
constrain: true,
constrainHeader: true,
animateTarget: ‘target‘,
modal: false,
autoScroll: true,
autowidth: true,
autoHeight: true,
closeAction: ‘hide‘,
defaultType: ‘textfield‘,
items: [form],
buttonAlign: ‘center‘,
defaultButton: ‘0‘,
buttons: [
{
text: ‘确定‘,
align: ‘center‘,
handler: function () {
//遍历新增表单
value = "";
form.items.each(function (item, index, length) {
value += item.initialConfig.name + ":";
value += "‘" + Ext.getCmp(item.initialConfig.id).getValue() + "‘,";
});
value = "{" + value.substring(0, value.lastIndexOf(‘,‘)) + "}";
Ext.Ajax.request({
url: "CodeManager.aspx?opt=New&&node=" + node + "&&codeStruct=" + value + "",
method: "POST",
async: false,
success: function (response) {
if (response.responseText != 0) {
Ext.Msg.alert("提示信息", "添加成功!");
win_new.hide();
grid.store.reload();
}
else {
Ext.Msg.alert("提示信息", "添加失败!");
}
},
failure: function () {
win_new.hide();
Ext.Msg.alert("提示信息", "惟一字段数据重复或数据为空!");
}
});

}
}
, {
text: ‘取消‘,
align: ‘center‘,
tooltip: ‘退出并关闭当前窗口‘,
handler: function () {
win_new.hide();
}
}
]
});
win_new.show();
}
},
{
text: ‘修改‘,
id: ‘btn_sub‘,
iconCls: ‘modIcon‘,
handler: function Modify() {
var rows = grid.getSelectionModel().getSelections();
if (rows.length == 0) {
Ext.Msg.alert("提示信息", ‘请至少选择一条记录‘);
return;
}
$("#win_update").html("");
items = "";
for (var i = 0; i < grid.colModel.config.length; i++) {
field = grid.colModel.config[i];
items += "{fieldLabel: ‘" + field.header + "‘,name: ‘" + field.dataIndex + "_update‘,id: ‘" + field.dataIndex + "_update‘,width: 180},";
}
//截取以逗号结尾之前的部分
items = "[" + items.substring(0, items.lastIndexOf(‘,‘)) + "]";
//将字符串转换成JSON对象
items = eval(items);
//修改表单
var form = new Ext.form.FormPanel({ //创建表单面板
labelAlign: ‘center‘, //水平对齐方式
layout: ‘form‘, //布局模式
id: ‘form_modify‘, //设置ID
labelWidth: 100, //宽度
frame: true, //是否显示frame
defaultType: ‘textfield‘, //默认文本类型
defaults: { allowBlank: false }, //默认是否允许为空
autoHeight: true, //自适应高度
autoWidth: true, //自适应宽度
bodyStyle: ‘padding:0 0 10px 30px;‘, //设置窗体样式
items: items
});

//表单循环
form.items.each(function (item) {
var rec = rows[0].json;
//数据结构循环
for (var key in rec) {
if (item.id == (key + "_update")) {
Ext.getCmp(key + "_update").setValue(rec[key]);
};
}
});

//修改窗体
var win_update = new Ext.Window({
el: ‘win_update‘,
layout: ‘form‘,
resizable: false,
title: ‘<center>修改结构表信息</center>‘,
constrain: true,
constrainHeader: true,
animateTarget: ‘target‘,
modal: false,
autoScroll: true,
autowidth: true,
autoHeight: true,
closeAction: ‘hide‘,
defaultType: ‘textfield‘,
items: [form],
buttonAlign: ‘center‘,
defaultButton: ‘0‘,
buttons: [
{
text: ‘确定‘,
align: ‘center‘,
handler: function () {
//遍历修改表单,获取表单的值
value = "";
form.items.each(function (item) {
value += item.initialConfig.name + ":";
value += "‘" + Ext.getCmp(item.initialConfig.id).getValue() + "‘,";
});
value = "{" + escape(value.substring(0, value.lastIndexOf(‘,‘)))
+ "}";

rowVal = ‘‘;
var name = rows[0].json;
for (var key in name) {
rowVal += key + ":" + name[key] + ",";
}
rowVal = "{" + escape(rowVal.substring(0, rowVal.lastIndexOf(‘,‘))) + "}";

Ext.Ajax.request({
url: "CodeManager.aspx?opt=Modify&&node=" + node + "&&codeStruct=" + value + "&&rowVal=" + rowVal + "",
method: "POST",
async: false,
success: function (response) {
if (response.responseText != 0) {
Ext.Msg.alert("提示信息", "修改成功!");
win_update.hide();
grid.store.reload();
}
else {
win_update.hide();
Ext.Msg.alert("提示信息", "修改失败!");
}
},
failure: function () {
win_update.hide();
Ext.Msg.alert("提示信息", "修改的数据不符合规范!");
}
});

}
}
, {
text: ‘取消‘,
align: ‘center‘,
tooltip: ‘退出并关闭当前窗口‘,
handler: function () {
win_update.hide();
}
}
]
});
win_update.show();

}
},
{
text: ‘删除‘,
id: ‘btn_del‘,
iconCls: ‘delIcon‘,
handler: function Delete() {
//获取行对象
var rows = grid.getSelectionModel().getSelections();
if (rows.length == 0) {
Ext.Msg.alert("提示信息", ‘请至少选择一条记录‘);
return;
}
//遍历选中行
rowVal = ‘‘;
var name = rows[0].json;
for (var key in name) {
rowVal += key + ":" + name[key] + ",";
}
rowVal = "{" + rowVal.substring(0, rowVal.lastIndexOf(‘,‘)) + "}";
Ext.Msg.confirm(‘请确认‘, ‘您确定要删除这些信息吗?‘,function (button, text) {
if (button == "yes") {
Ext.Ajax.request({
url: "CodeManager.aspx?opt=Del&&node=" + node + "&&rowVal=" + rowVal + "",
method: "POST",
async: false,
buttons: { yes: ‘确定‘, no: ‘取消‘ },
success: function (response) {
if (response.responseText != 0) {
Ext.Msg.alert("提示信息", "删除成功!");
grid.store.reload();
}
else {
Ext.Msg.alert("提示信息", "删除失败!");
}
}
});
}
});
}
}
]
});
};

//请求列、节点,返回列和数据
var params = { "node": node, "opt": "GetColumn" };
Ext.Ajax.request({ //回传请求
url: "CodeManager.aspx", //回传地址
params: params, //回传参数
success: function (response, option) {
if (response.responseText == "") {
return;
}
data = new addColumn();
//JSON格式化返回结果(字符串类型)转换成JSON对象
var res = Ext.util.JSON.decode(response.responseText);
//循环JSON对象,取出特定列
for (var i = 0; i < res.length; i++) {
var rec = res[i];
data.addColumns(rec.COLUMNS, rec.ZH_CN);
}
//清除代码表
$("#content").html(‘‘);
$("#win_new").html(‘‘);
createGrid();
},
failure: function () {
Ext.Msg.alert("消息", "查询出错,请打开数据库查看数据表名是否正确?", "谢谢");
}
});
});

extjs动态树 动态grid 动态列,布布扣,bubuko.com

时间: 2024-08-04 03:28:53

extjs动态树 动态grid 动态列的相关文章

HDU 2475 BOX 动态树 Link-Cut Tree 动态树模板

Box Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) [Problem Description] There are N boxes on the ground, which are labeled by numbers from 1 to N. The boxes are magical, the size of each one can be enlarged or r

如何利用FineReport制作动态树报表

在对数据字段进行分类管理时,利用动态树折叠数据是一个很好的方法,也就是点击数据前面的加号才展开对应下面的数据,如下图.那这样的效果在制作报表时该如何实现呢? 下面以报表工具FineReport为例介绍. 思路: 通过将模版设置为组织树报表,然后通过设置树节点按钮,最好通过数据分析预览或者form表单预览即可查看效果. 步骤: 1.  初步建立模板 建立模板就相当于建立一个excel的sheet,只不过是cpt的形式.把相应的字段拖到单元格内. 2.  增加树节点按钮 通过设置树节点按钮来实现折叠

ExtJS4 动态生成的grid导出为excel(纯前台)

搜索了蛮久,找到一些例子,因为我是初学者的缘故大多不知道怎么使用.. 研究了一下那个源码,搞到现在终于实现了基本的下载..解决了一个表格不能重复下载的小BUG,一个使用grid初始化发生的BUG 下面记录一下步骤..说不定下次还有用 1.下载需要用到js代码,我已经上传 http://download.csdn.net/detail/hu8471479/7281703 2.在你的html文件中加入引用,路径问题自己 注意下,下面是我的路径 <script type="text/javasc

使用angularjs ui grid 动态加载列名

来个开场白吧: 我是做.net开发的,来到新公司后,缺一个前端开发,SO,我就不得不挠着头干活呀......之前也就写写js,jq,刚看到前端架构的时候一脸懵逼...心里就有三个字:什么鬼!什么angularjs,angularjs ui grid,bootstrap,阿西吧.. 木有办法,总不能又跳槽吧.熟悉了一两天业务和代码后,经理说:"开干!". 首先,做的第一个功能就是使用angularjs ui grid 动态加载列.(这里不得不吐槽一点,ui grid的官方文档实例太少了,

动态树 学习

学习动态树,我们首先需要了解到什么是Splay,推荐这一篇大聚聚yyb的博客. 我们在LCT中列写的Splay会以yyb的splay为基础作出改变,也是方便大家的后继学习,这样的排版. LCT主要解决什么问题呢? 维护一个数据结构, 支持以下操作: 查询一个点的父亲 查询一个点所在的树的根 修改某个节点的权 向从某个节点到它所在的树的根的路径上的所有的节点的权增加一个数 查询从某个节点到它所在的树的根的路径上的所有的节点的权的最小值 把一棵树从某个节点和它的父亲处断开,使其成为两棵树 让一棵树的

luoguP3690 【模板】Link Cut Tree (动态树)[LCT]

题目背景 动态树 题目描述 给定N个点以及每个点的权值,要你处理接下来的M个操作.操作有4种.操作从0到3编号.点从1到N编号. 0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和.保证x到y是联通的. 1:后接两个整数(x,y),代表连接x到y,若x到Y已经联通则无需连接. 2:后接两个整数(x,y),代表删除边(x,y),不保证边(x,y)存在. 3:后接两个整数(x,y),代表将点X上的权值变成Y. 输入输出格式 输入格式: 第1行两个整数,分别为N和M,代表点数和操

bzoj 2631: tree 动态树+常数优化

2631: tree Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 1716  Solved: 576[Submit][Status] Description 一棵n个点的树,每个点的初始权值为1.对于这棵树有q个操作,每个操作为以下四种操作之一:+ u v c:将u到v的路径上的点的权值都加上自然数c:- u1 v1 u2 v2:将树中原有的边(u1,v1)删除,加入一条新边(u2,v2),保证操作完之后仍然是一棵树:* u v c:将u到v的

动态树 Link-Cut Trees

动态树 动态树问题, 即要求我们维护一个由若干棵子结点无序的有根树组成的森林. 要求这个数据结构支持对树的分割.合并,对某个点到它的根的路径的某些操作,以及对某个点的子树进行的某些操作. 在这里我们考虑一个简化的动态树问题,它只包含对树的形态的操作和对某个点到根的路径的操作: 维护一个数据结构,支持以下操作: • MAKE TREE() — 新建一棵只有一个结点的树. • CUT(v) — 删除 v 与它的父亲结点 parent(v) 的边,相当于将点 v 的子树分离了出来. • JOIN(v,

bzoj2243 [SDOI2011]染色 动态树

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define N 110000 int pre[N],ch[N][2]; int e[N],ne[N*2],v[N*2]; int nn,m; int col[N]; int lc[N],sm[N],rc[N],num[N]; int rt[N],n; int qu[N