您的位置:首页 > 其它

Ext.grid.EditorGridPanel

2013-04-03 17:12 483 查看
Ext.Grid的强大功能想必用过Ext的都体会到,可以隐藏列,可以拖放,可以排序等等,但是如果用户隐藏了某一些列后,下次登录时还是要看到上次隐藏后的列该怎么办呢?这就涉及到一个用户使用习惯的问题。想到记录用户习惯,当然首选使用Cookie。但是问题来了,在什么时候记录Cookie?什么事件触发后我们去写Cookie?其实最完美的当然就是在隐藏列这一事件(暂且叫它事件吧,具体的我也不太清楚Ext隐藏列的原理)触发时把剩下的列写入Cookie,但是小生才疏学浅,没有找到这个“隐藏列”事件,没法重写,只好另辟蹊径。反反复复试了Grid自带的方法比如:Close,BeforeClose,打算在用户关闭Grid的时候记录,但是没有效果,最后才找到beforedestroy这一事件,匪夷所思,关闭grid的时候不是触发beforeclose或者close,偏偏来个beforedestroy(英文就是摧毁,销毁),难道是Ext的人的命名习惯?不解。说到这里思路就清楚了,实现原理及步骤如下:

1、在用户关闭Grid时,触发BeforeDestroy事件,判断那些列是隐藏的,写入Cookie:

Java代码


grid.on("beforedestroy", CloseWriteCookie, grid);

// 按用户习惯,隐藏某列

if (boolHasClosedGrid == false)// 首次浏览

{

HiddenMyColumn(grid, varHiddenColumn);

// alert(varHiddenColumn);

}

// 关闭grid但未关闭浏览器

else {

HiddenMyColumn(grid, varHiddenColumnColseGrid);

}

Java代码


1//写入CooKie事件

2

3function CloseWriteCookie(obj) {

4 var cms = obj.getColumnModel(); // 获得网格的列模型

5 var strHiddenColoumnIndex = "";// 存储当前网格已经显示的列名(列名之间用 "," 分隔)

6 // alert(cms.getColumnCount());

7 for (var i = 0; i < cms.getColumnCount(); i++) {// 处理当前显示的列

8

9 if (cms.isHidden(i) && cms.getDataIndex(i) != "") {// 判断是否是隐藏列

10 strHiddenColoumnIndex += Ext.util.Format.trim(i) + ",";// 获得列序号数字从0开始

11 }

12 }

13 // 把隐藏列存到Cookie中的同时返回隐藏列的值。

14 Ext.Ajax.request({

15 timeout : 3000000,

16 url : '/ajax/SetUserColumnCookie.aspx',

17 params : "ParaCkUserColumn=Write&UserHiddenColumn="

18 + strHiddenColoumnIndex,

19 success : function(response, options) {

20 Ext.MessageBox.hide();

21 varHiddenColumnColseGrid = response.responseText// 把最新的隐藏列赋值给全局变量varHiddenColumnColseGrid

22 // alert(varHiddenColumnColseGrid);

23 boolHasClosedGrid = true;// 设置关闭grid但未关闭浏览器为真

24 },

25 failure : function(response, options) {

26 Ext.Msg.alert('错误', Ext.util.JSON

27 .decode(response.responseText).data.msg);

28

29 }

30 }

31

32 )

33}

34

35

2、用户再次打开这个页面时先用Ajax读Cookie中的隐藏列,然后调用HiddenColumn函数,执行隐藏列。

Java代码


Ext.Ajax.request({

timeout : 3000000,

url : '/ajax/SetUserColumnCookie.aspx',

params : "ParaCkUserColumn=Read",

success : function(response, options) {

Ext.MessageBox.hide();

varHiddenColumn = response.responseText

// alert(varHiddenColumn);

},

failure : function(response, options) {

Ext.Msg.alert('错误',

Ext.util.JSON.decode(response.responseText).data.msg);

}

})

1 // 隐藏列函数

2 function HiddenMyColumn(vargrid, varColumnIndex) {

3

4 if (varColumnIndex != "") {

5 var cms = vargrid.getColumnModel(); // 获得网格的列模型

6 var strarrayUserColumn = new Array();

7 strarrayUserColumn = varColumnIndex.split(",");

8 for (var i = 0; i < strarrayUserColumn.length; i++) {

9 cms.setHidden(strarrayUserColumn[i], true);// 隐藏列模型

10 }

11 }

12 }

欢迎各位批评指正。如果有更好的实现方法,请您不吝赐教。

附上完整的JS文件吧,后台aspx,cs文件就不贴了,有需要联系我

TotalJS.js

Java代码


var ds;

var varHiddenColumn = "";

var boolHasClosedGrid = false;

Ext.Ajax.request({

timeout : 3000000,

url : '/ajax/SetUserColumnCookie.aspx',

params : "ParaCkUserColumn=Read",

success : function(response, options) {

Ext.MessageBox.hide();

varHiddenColumn = response.responseText

// alert(varHiddenColumn);

},

failure : function(response, options) {

Ext.Msg.alert('错误',

Ext.util.JSON.decode(response.responseText).data.msg);

}

})

function QueryWebTraceByAll() {

var varDefaultState = "";

Ext.BLANK_IMAGE_URL = 'extjs/resources/images/default/s.gif';

Ext.QuickTips.init();

// var fm = Ext.form;

var sm = new Ext.grid.CheckboxSelectionModel();

var cm = new Ext.grid.ColumnModel([new Ext.grid.RowNumberer(), sm, {

header : '编号',

width : 40,

dataIndex : 'Id',

sortable : true

}, {

header : '域名',

width : 100,

dataIndex : 'HostName',

renderer : change,

sortable : true

}, {

header : '流量',

width : 50,

dataIndex : 'PageView',

sortable : true

}, {

header : '测试域名',

width : 100,

dataIndex : 'TestHostName',

renderer : change,

sortable : true

}, {

header : '服务器IP',

width : 140,

dataIndex : 'WebSpace',

sortable : true

}, {

header : '空间用户名',

width : 100,

dataIndex : 'WebSpaceUserName',

sortable : true

}, {

header : '空间名',

width : 100,

dataIndex : 'WebSpaceNumber',

sortable : true

}, {

header : "Ftp密码",

width : 100,

dataIndex : 'FtpPwd',

sortable : true

},

{

header : '备案号',

width : 140,

dataIndex : 'BeiAn',

sortable : true

},// renderer:renderFoo,

{

header : '域名服务商',

width : 140,

dataIndex : 'HostNameSP',

sortable : true

},// renderer:renderFoo,

{

header : '域名注册时间',

width : 140,

dataIndex : 'HostNameRegDate',

sortable : true

},// renderer:renderFoo,

{

header : '域名到期时间',

width : 140,

dataIndex : 'HostNameExpireDate',

sortable : true

},// renderer:renderFoo,

{

header : '类型',

width : 50,

dataIndex : 'WebType',

sortable : true

}, {

header : '主关键字',

width : 100,

dataIndex : 'KeyWords',

sortable : true

}, {

header : '副关键词',

width : 100,

dataIndex : 'SubKeyWords',

sortable : true

}, {

header : '状态',

width : 100,

dataIndex : 'State',

sortable : true

}, {

header : '分配人',

width : 100,

dataIndex : 'Assumer',

sortable : true

}, {

header : '制作人',

width : 40,

dataIndex : 'Producer',

sortable : true

}, {

header : '模板',

width : 56,

dataIndex : 'Template',

sortable : true

}, {

header : '负责人',

width : 40,

dataIndex : 'Maintainer',

sortable : true

}, {

header : '组长',

width : 40,

dataIndex : 'TeamLeader',

sortable : true

}, {

header : '维护人51la',

width : 65,

dataIndex : 'MaintainerStatisId',

sortable : true

}, {

header : '网站51la',

width : 51,

dataIndex : 'StatisId',

sortable : true

}, {

header : '密码',

width : 45,

dataIndex : 'MaintainerFivelaPwd',

sortable : true

}, {

header : '收录',

width : 30,

dataIndex : 'Baidu',

sortable : true

}, {

header : '分配时间',

width : 100,

dataIndex : 'ToTeamLeaderDate',

sortable : true

}, {

header : '制作时间',

width : 100,

dataIndex : 'StartDoDate',

sortable : true

}, {

header : '完成时间',

width : 100,

dataIndex : 'EndDoDate',

sortable : true

}, {

header : '审核时间',

width : 100,

dataIndex : 'CheckDate',

sortable : true

}, {

header : '组员评分',

width : 100,

dataIndex : 'Score',

sortable : true

}, {

header : '分配人评分',

width : 100,

dataIndex : 'AssumerScore',

sortable : true

}, {

header : '综合评分',

width : 100,

dataIndex : 'TotalScore',

sortable : true

}]);

// proxy直接去读取josn数据【

ds = new Ext.data.Store({

proxy : new Ext.data.HttpProxy({

url : 'WebTask/WebsiteGeneral/ShowWebSiteAsZWToLeader.aspx'

}),

reader : new Ext.data.JsonReader({

totalProperty : 'totalProperty',

root : 'Head',

successProperty : 'success'

}, [{

name : 'Id',

mapping : 'Id',

type : 'int'

}, {

name : 'HostName',

mapping : 'HostName',

type : 'string'

}, {

name : 'TestHostName',

mapping : 'TestHostName',

type : 'string'

}, {

name : "FtpPwd",

mapping : "FtpPwd",

type : "string"

}, {

name : 'WebSpaceNumber',

mapping : 'WebSpaceNumber',

type : 'string'

}, {

name : 'WebSpaceUserName',

mapping : 'WebSpaceUserName',

type : 'string'

}, {

name : 'BeiAn',

mapping : 'BeiAn',

type : 'string'

}, {

name : 'State',

mapping : 'State',

type : 'string'

}, {

name : 'WebSpace',

mapping : 'WebSpace',

type : 'string'

}, {

name : 'Assumer',

mapping : 'Assumer',

type : 'string'

}, {

name : 'HostNameSP',

mapping : 'HostNameSP',

type : 'string'

}, {

name : 'HostNameRegDate',

mapping : 'HostNameRegDate',

type : 'string'

}, {

name : 'HostNameExpireDate',

mapping : 'HostNameExpireDate',

type : 'string'

}, {

name : 'MaintainerStatisId',

mapping : 'MaintainerStatisId',

type : 'string'

}, {

name : 'StatisId',

mapping : 'StatisId',

type : 'string'

}, {

name : 'MaintainerFivelaPwd',

mapping : 'MaintainerFivelaPwd',

type : 'string'

}, {

name : 'Baidu',

mapping : 'Baidu',

type : 'string'

}, {

name : 'PageView',

mapping : 'PageView',

type : 'string'

}, {

name : 'WebType',

mapping : 'WebType',

type : 'string'

}, {

name : 'KeyWords',

mapping : 'KeyWords',

type : 'string'

}, {

name : 'SubKeyWords',

mapping : 'SubKeyWords',

type : 'string'

}, {

name : 'StartTaskDate',

mapping : 'StartTaskDate',

type : 'string'

}, {

name : 'CheckDate',

mapping : 'CheckDate',

type : 'string'

}, {

name : 'StartDoDate',

mapping : 'StartDoDate',

type : 'string'

}, {

name : 'EndDoDate',

mapping : 'EndDoDate',

type : 'string'

}, {

name : 'TeamLeader',

mapping : 'TeamLeader',

type : 'string'

}, {

name : 'Maintainer',

mapping : 'Maintainer',

type : 'string'

}, {

name : 'Producer',

mapping : 'Producer',

type : 'string'

}, {

name : 'Template',

mapping : 'Template',

type : 'string'

}, {

name : 'ToTeamLeaderDate',

mapping : 'ToTeamLeaderDate',

type : 'string'

}, {

name : 'ToTeamDate',

mapping : 'ToTeamDate',

type : 'string'

}, {

name : 'Score',

mapping : 'Score',

type : 'string'

}, {

name : 'AssumerScore',

mapping : 'AssumerScore',

type : 'string'

}, {

name : 'TotalScore',

mapping : 'TotalScore',

type : 'string'

}]),

remoteSort : true

});

var store = new Ext.data.Store({

proxy : new Ext.data.HttpProxy({

url : "WebTask/WebsiteGeneral/GetEmployeeAsGroup.aspx?type=z"

}), // 数据源

reader : new Ext.data.JsonReader({

totalProperty : "totalPorperty",

root : "Head",

successProperty : 'success',

fields : [{

name : 'id',

mapping : 'id',

type : 'string'

}, {

name : 'username',

mapping : 'username',

type : 'string'

}]

})

// 如何解析

});

store.load();

var storeddl = new Ext.data.Store({

proxy : new Ext.data.HttpProxy({

url : "WebTask/WebsiteGeneral/GetParaList.aspx?MenuId=0010"

}), // 下拉框数据源

reader : new Ext.data.JsonReader({

totalProperty : "totalPorperty",

root : "Head",

successProperty : 'success',

fields : [{

name : 'ParaName',

mapping : 'ParaName',

type : 'string'

}, {

name : 'ParaValue',

mapping : 'ParaValue',

type : 'string'

}]

})

// 如何解析

});

// 状态数据集,非数据库

var DdlState = new Ext.data.SimpleStore({

fields : ['ParaName', 'ParaValue'],

data : [['所有', ''], ['准备制作', '准备制作'], ['正在制作中', '正在制作中'],

['已制作完成', '已制作完成'], ['已审核', '已审核'],

['已分配给组长', '已分配给组长'], ['已分配给组员', '已分配给组员']]

});

storeddl.load();

// 网站制作状态静态数据

var liebie = new Ext.form.ComboBox({

id : 'dropdownliststate',

emptyText : '请选择网站制作状态',

mode : 'local', // 数据模式,local为本地模式

readOnly : true,

hidden : true,

displayField : 'ParaName',

valueField : 'ParaValue',

triggerAction : 'all',

name : 'identity', // 作为form提交时传送的参数

store : DdlState,

listeners : {

select : {

fn : function(combo, record, index) {

// 先清理数据

ds.removeAll();

ds.baseParams = {

paraname : grid.topToolbar.items.items[0].value,

paravalue : record.get('ParaValue')

};

ds.load({

callback : function(r, options, success) {

if (success == false) {

// 如果没有数据就清空

ds.removeAll();

Ext.MessageBox.alert('提示',

'Sorry,没有符合条件的数据');

}

}

});

ds.reload({

params : {

start : 0,

limit : 20

}

});

}

}

}

});

var grid = new Ext.grid.EditorGridPanel({

renderTo : 'grid3',

ds : ds,

sm : sm,

stripeRows : true,

cm : cm,

width : 700,

height : 280,

loadMask : true,

tbar : new Ext.Toolbar({

items : [new Ext.form.ComboBox({

id : 'ComSearch',

emptyText : '请选择搜索项目',

mode : 'remote', // 数据模式,local为本地模式

readOnly : true,

displayField : 'ParaName',

valueField : 'ParaValue',

triggerAction : 'all',

name : 'identity', // 作为form提交时传送的参数

store : storeddl,

listeners : {

select : {

fn : function(combo, record, index) {

if (record.get('ParaValue') == 'State') {

liebie.show();

Ext.get('txtsearchword')

.setDisplayed('none');

Ext.get('btnSearch')

.setDisplayed('none');

} else {

liebie.hide();

Ext.get('txtsearchword')

.setDisplayed('block');

Ext.get('btnSearch')

.setDisplayed('block');

}

}

}

}

}),

// 网站状态静态数据

liebie, new Ext.form.TextField({

id : 'txtsearchword',

fieldLabel : '搜索文字',

width : 150,

name : 'SearchWord',

allowBlank : false,

blankText : '请输入搜索文字',

listeners : {

specialKey : function(field, e) {

if (e.getKey() == Ext.EventObject.ENTER) {

ds.removeAll();

ds.baseParams = {

paraname : grid.topToolbar.items.items[0].value,

paravalue : Ext.get('txtsearchword').dom.value

};

ds.load({

callback : function(r, options, success) {

if (success == false) {

Ext.MessageBox.alert('提示',

'Sorry,没有符合条件的数据');

}

}

});

ds.reload({

params : {

start : 0,

limit : 20

}

});

}

}

}

}),

{

id : 'btnSearch',

text : '搜索',

iconCls : 'search',

handler : function() {

ds.removeAll();

ds.baseParams = {

paraname : grid.topToolbar.items.items[0].value,

paravalue : Ext.get('txtsearchword').dom.value

};

ds.load({

callback : function(r, options, success) {

if (success == false) {

// 如果为空就清空原来数据

Ext.MessageBox.alert('提示',

'Sorry,没有符合条件的数据');

}

}

});

ds.reload({

params : {

start : 0,

limit : 20

}

});

}

}]

}),

bbar : new Ext.PagingToolbar({

pageSize : 20,

store : ds,

displayInfo : true,

displayMsg : '显示第 {0} 条到 {1} 条记录,一共 {2} 条',

emptyMsg : "没有记录",

items : [{

text : '导出Excel',

iconCls : 'add',

tooltip : "点击导出Excel文件",

handler : function() {

// 导出Excel文件

var cms = grid.getColumnModel(); // 获得网格的列模型

var strColoumnNames = "";// 存储当前网格已经显示的列名(列名之间用 "," 分隔)

var strColoumnNamesHeader = "";

var strAllSql = "";

for (var i = 0; i < cms.getColumnCount(); i++) {// 处理当前显示的列

if (!cms.isHidden(i) && cms.getDataIndex(i) != "") {// 判断是否是隐藏列及是否列名为空(因为如果有选择框和默认序号,则为空)

strColoumnNames = Ext.util.Format.trim(cms

.getDataIndex(i));// 获得列名

// 判断是否是综合评分这列,如果是要把列名换成原始的

strColoumnNamesHeader = escape(Ext.util.Format

.trim(cms.getColumnHeader(i)));// 获得列标题

strAllSql += strColoumnNames + " as "

+ strColoumnNamesHeader + ",";// 拼接Sql查询语句,格式

// 字段 as

// 中文标题

}

}

// self表示在本窗口打开

var varparaname = grid.topToolbar.items.items[0].value;

var varparavalue = Ext.util.Format.trim(Ext

.get('txtsearchword').dom.value);

var varparanametext = Ext.get('ComSearch').dom.value

var gridtoexcelwindow;

if (typeof(varparaname) == "undefined") {

varparaname = "State";

varparavalue = varDefaultState;

varparanametext = "默认首要业务数据";

}

gridtoexcelwindow = window

.open( "Ajax/GridToExcel.aspx?sql=" + strAllSql

+ "&FromTable=WebTrace&ParaName="

+ escape(varparaname)

+ "&ParaNameText="

+ escape(varparanametext)

+ "&ParaValue="

+ escape(varparavalue), "_self",

"menubar=0,scrollbar=0,resizable=0,channelmode=0,location=0,status=0");

gridtoexcelwindow.focus();

}

}]

})

});

// el:指定html元素用于显示grid

grid.render();// 渲染表格

//

ds.baseParams = {

paraname : 'State',

paravalue : varDefaultState

};

ds.load({

callback : function(r, options, success) {

if (success == false) {

ds.removeAll();

Ext.MessageBox.alert('提示', 'Sorry,没有符合条件的数据');

}

}

});

ds.reload({

params : {

start : 0,

limit : 20

}

});

var win = new Ext.Window({

layout : 'fit',

maximizable : true,

collapsible : true,

width : 1000,

height : 600,

modal : true,

title : "公共查询界面:在这里您可以查询您需要的网站并可以导出所需数据<br/><font color='#FF0000'><b>小提示:<br/>1、您可以点击任一列名右侧出现的箭头,在出现的下拉框中,隐藏某些您不需要的列。您再次进入此页面时将保持您上次保留的列。<br/>2、搜索支持回车键。<br/>3、在窗体底部有'导出Excel'按钮,你可以导出您需要的数据</b></font>",

items : grid

});

win.show();

grid.on("afteredit", afterEdit1, grid);

grid.on("beforedestroy", CloseWriteCookie, grid);

// 按用户习惯,隐藏某列

if (boolHasClosedGrid == false)// 首次浏览

{

HiddenMyColumn(grid, varHiddenColumn);

// alert(varHiddenColumn);

}

// 关闭grid但未关闭浏览器

else {

HiddenMyColumn(grid, varHiddenColumnColseGrid);

}

}

// 隐藏列函数

function HiddenMyColumn(vargrid, varColumnIndex) {

if (varColumnIndex != "") {

var cms = vargrid.getColumnModel(); // 获得网格的列模型

var strarrayUserColumn = new Array();

strarrayUserColumn = varColumnIndex.split(",");

for (var i = 0; i < strarrayUserColumn.length; i++) {

cms.setHidden(strarrayUserColumn[i], true);// 隐藏列模型

}

}

}

// 关闭时写cookie

function CloseWriteCookie(obj) {

var cms = obj.getColumnModel(); // 获得网格的列模型

var strHiddenColoumnIndex = "";// 存储当前网格已经显示的列名(列名之间用 "," 分隔)

// alert(cms.getColumnCount());

for (var i = 0; i < cms.getColumnCount(); i++) {// 处理当前显示的列

if (cms.isHidden(i) && cms.getDataIndex(i) != "") {// 判断是否是隐藏列

strHiddenColoumnIndex += Ext.util.Format.trim(i) + ",";// 获得列序号数字从0开始

}

}

// 把隐藏列存到Cookie中的同时返回隐藏列的值。

Ext.Ajax.request({

timeout : 3000000,

url : '/ajax/SetUserColumnCookie.aspx',

params : "ParaCkUserColumn=Write&UserHiddenColumn="

+ strHiddenColoumnIndex,

success : function(response, options) {

Ext.MessageBox.hide();

varHiddenColumnColseGrid = response.responseText// 把最新的隐藏列赋值给全局变量varHiddenColumnColseGrid

// alert(varHiddenColumnColseGrid);

boolHasClosedGrid = true;// 设置关闭grid但未关闭浏览器为真

},

failure : function(response, options) {

Ext.Msg.alert('错误', Ext.util.JSON

.decode(response.responseText).data.msg);

}

}

)

}

// 编辑时的检验是否合法,不合法不更新

function afterEdit1(obj) {

var r = obj.record;// 获取被修改的行

var l = obj.field;// 获取被修改的列

var o = obj.originalValue;

var id = r.get("Id");

var lie = r.get(l);

Ext.Ajax.request({

url : '/Ajax/WebsiteOper.aspx?type=3',

params : "id=" + id + "&name=" + l + '&value=' + lie

});

var cursor = this.getBottomToolbar().cursor;

ds.load({

params : {

start : cursor,

limit : this.getBottomToolbar().pageSize

}

});

}

function DEL(Obj) {

var cursor = Obj.getBottomToolbar().cursor;

ds.load({

params : {

start : cursor,

limit : Obj.getBottomToolbar().pageSize

}

});

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: