使用extjs开发时常会用到 grid来显示数据等操作,Extjs中Grid主要分为以下二类:
一、gridview
二、groupingview
gridview在前面已说过,在这里我来说说groupingview的使用方法, 在EXTJS里,实现很简单,只需要简单设置下就可以实现。具体可以参照EXTJS学习笔记:grid之gridview。
在这里要注意使用的是GroupingStore而不是Store,其中重点是要设置groupField的值 ,该字段表示默认的分组字段。由于与GridView类似,所在不详细说明,先把截图先贴出来,让大家看下有多酷。
在这里实现了按父菜单分组,当然也可以实现任意一列的分组,方法是选某列,在出现的下拉列表(如下图所示)中,
选择“根据本列分组”
下面我把源代码放出来,
源代码:
/*
* 菜单管理
* MenuInfoManage.js
* author:☆会飞的鱼☆
* date 2009-10-15
*/
var MenuInfoStore;
MenuInfoManage = function(node) {
var pmenufields = Ext.data.Record.create([
{ name: 'menucode', mapping: 'menucode' }, { name: 'menuname', mapping: 'menuname' }
]);
var pmenustore = new Ext.data.Store({
proxy: new Ext.data.HttpProxy({
url: 'UI/MenuInfo/GetAllPMenuInfo.aspx'
}),
reader: new Ext.data.JsonReader({
root: 'data',
id: 'menucode'
},
pmenufields
)
});
pmenustore.load();
var fields = ["menuid", "menucode", "menuname", "pmenucode","pmenuname", "menuurl", "state", "remark"];
MenuInfoStore = new Ext.data.GroupingStore({
proxy: new Ext.data.HttpProxy({
url: "UI/MenuInfo/MenuInfoManager.aspx",
method: "POST"
}),
reader: new Ext.data.JsonReader({
fields: fields,
root: "data",
dataIndex: "menuid",
totalProperty: "totalCount"
}),
groupField: 'pmenuname',//默认的分组字段
sortInfo: { field: 'menucode', direction: "ASC" }
});
MenuInfoStore.load({ params: { limit: pageSize, start: 0} });
var sm = new Ext.grid.CheckboxSelectionModel({
dataIndex: "menuid"
});
var cm = new Ext.grid.ColumnModel([sm,
{
header: "菜单名称",
dataIndex: "menuname",
tooltip: "菜单名称",
sortable: true
}, {
header: "父菜单",
dataIndex: "pmenucode",
tooltip: "父菜单",
hidden: true,
hideable:false
}, {
header: "父菜单",
dataIndex: "pmenuname",
tooltip: "父菜单",
sortable: true
}, {
header: "菜单URL",
dataIndex: "menuurl",
tooltip: "菜单URL",
sortable: true
}, {
header: "状态",
dataIndex: "state",
tooltip: "状态",
width: 40,
sortable: true,
renderer: function(value) {
if (value == 0) {
return "<b><font color=red>无效</font></b>";
} else if (value == 1) {
return "有效";
}
},
editor: new Ext.form.ComboBox({
store: new Ext.data.SimpleStore({
data: [["无效", "0"], ["有效", "1"]],
fields: ["text", "value"]
}),
tpl: '<tpl for="."><div ext:qtip="设置菜单状态为--{text}" class="x-combo-list-item">{text}</div></tpl>',
displayField: "text",
mode: "local",
valueField: "value",
triggerAction: "all"
})
}, {
header: "备注",
dataIndex: "remark",
tooltip: "备注",
sortable: true
}]);
var MenuGrid = new Ext.grid.GridPanel(
{
id: "MenuGrid",
store: MenuInfoStore,
sm: sm, //CheckboxSelectionModel
cm: cm, //ColumnModel
loadMask: true,
autoScroll: true, //超过长度带自动滚动条
border: false,
view: new Ext.grid.GroupingView({
forceFit: true, //自动填充
sortAscText: '正序排列',
sortDescText: '倒序排列',
columnsText: '列显示/隐藏',
groupByText: '根据本列分组',
showGroupsText: '是否采用分组显示',
groupTextTpl: '{text}(<b><font color=red>{[values.rs.length]}</font></b> {[values.rs.length > 0 ? "个子菜单" : "暂无子菜单信息"]})'
/*groupTextTpl: '{group}(<b><font color=red>{[values.rs.length]}</font></b> {[values.rs.length > 0 ? "个子菜单" : "暂无子菜单信息"]})' -------text=header+":"+group
*/
}),
//分页
bbar: new Ext.PagingToolbar({
store: MenuInfoStore,
pageSize: pageSize,
//显示右下角信息
displayInfo: true,
displayMsg: '当前记录 {0} -- {1} 条 共 {2} 条记录',
emptyMsg: "No results to display",
prevText: "上一页",
nextText: "下一页",
refreshText: "刷新",
lastText: "最后页",
firstText: "第一页",
beforePageText: "当前页",
afterPageText: "共{0}页"
}),
tbar: [
new Ext.Toolbar.Fill()
, "", "-", "", {
text: "新增根菜单",
tooltip: "新增根菜单信息",
iconCls: "addicon",
handler: AddPMenuInfoFn
}, "", "-", "", {
text: "新增",
tooltip: "新增菜单信息",
iconCls: "addicon",
handler: AddMenuInfoFn
}, "", "-", "", {
text: "编辑",
tooltip: "编辑菜单信息",
iconCls: "editicon",
handler: EditMenuInfoFn
}, "", "-", "", {
text: "删除",
tooltip: "删除菜单信息",
iconCls: "deleteicon",
handler: DelMenuInfoFn
}, "-"],
listeners: {
'contextmenu': function(e) {
e.stopEvent();
}
}
});
GridMain(node, MenuGrid, "menuicon");
}
function AddPMenuInfoFn() {
AddPMenuInfo();
}
function AddMenuInfoFn() {
AddMenuInfo();
}
function EditMenuInfoFn() {
var row = Ext.getCmp("MenuGrid").getSelectionModel().getSelections();
if (row.length == 0) {
Ext.Msg.alert("提示信息", "您没有选中任何行!");
}
else if (row.length == 1) {
if (row[0].data.pmenucode == "1") {
EditPMenuInfo(row[0]);
}
else {
EditMenuInfo(row[0]);
}
}
else {
Ext.Msg.alert("提示信息", "对不起只能选择一个!");
}
}
function DelMenuInfoFn() {
var row = Ext.getCmp("MenuGrid").getSelectionModel().getSelections();
if (row.length == 0) {
Ext.Msg.alert("提示信息", "您没有选中任何行!");
}
else {
Ext.Msg.confirm("提示信息", "您确定要删除选中的 " + row.length + " 条常用语吗", function(btn) {
if (btn == "yes") {
DelMenuInfo(row);
}
})
}
}