最近园子里有很多朋友关心ExtJS,我最近写了一个项目管理工具用到ExtJS,我结合.NET写了个关于Grid实现的一个实例供需要的朋友参考。
本实例开发环境是:Windows XP + Sql Server 2005 + IIS6+VS 2008 Beta2(.NET Framework3.5)
实现步骤:
1.取数据源
这里是从数据库里读取数据生产JSON的方式供ExtJS Grid调用.
(1)用Scott Guthrie提供的生产JSON格式的类,这篇文章可以访问:http://weblogs.asp.net/scottgu/archive/2007/10/01/tip,它的译文请访问:http://blog.joycode.com/scottgu/archive/2007/10/10/109268.aspx
建一个类文件JSONHelper.cs,代码如下:
<!--<br /><br /> <br /><br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /><br /> <a href="http://www.CodeHighlighter.com/" title="http://www.CodeHighlighter.com/">http://www.CodeHighlighter.com/</a><br /><br /> <br /><br /> -->1
usingSystem;2
usingSystem.Collections.Generic;3
usingSystem.Text;4
usingSystem.Web.Script.Serialization;5
namespaceWeb.Components6


{7
publicstaticclassJSONHelper8


{9
publicstaticstringToJSON(thisobjectobj)10


{11
JavaScriptSerializerserializer=newJavaScriptSerializer();12
returnserializer.Serialize(obj);13
}14

15
publicstaticstringToJSON(thisobjectobj,intrecursionDepth)16


{17
JavaScriptSerializerserializer=newJavaScriptSerializer();18
serializer.RecursionLimit=recursionDepth;19
returnserializer.Serialize(obj);20
}21
}22
}23
(2)利用LINQ读取数据记录,关于LINQ方面的文章参考Scott Guthrie的LINQ to SQL系列文章
为了方便ExtJS AJAX方式的调用,这里建一个ASPX页面,起名为:ProjectBaseInfo.aspx,代码如下:
<!--<br /><br /> <br /><br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /><br /> <a href="http://www.CodeHighlighter.com/" title="http://www.CodeHighlighter.com/">http://www.CodeHighlighter.com/</a><br /><br /> <br /><br /> -->1
usingSystem;2
usingSystem.Data;3
usingSystem.Configuration;4
usingSystem.Collections;5
usingSystem.Linq;6
usingSystem.Web;7
usingSystem.Web.Security;8
usingSystem.Web.UI;9
usingSystem.Web.UI.WebControls;10
usingSystem.Web.UI.WebControls.WebParts;11
usingSystem.Web.UI.HtmlControls;12
usingSystem.Xml.Linq;13
usingBusinessObject.Projects;//dbml文件的引用14
usingSystem.Data.OracleClient;15
usingDatabase;16
usingWeb.Components;17
namespaceWeb.Projects.JsonDataSource18


{19
publicpartialclassProjectBaseInfo:System.Web.UI.Page20


{21
protectedstringstrJsonSource=string.Empty;22
protectedvoidPage_Load(objectsender,EventArgse)23


{24
intstart=int.Parse(Request.Form["start"]+"");//分页需要limit,start是mysql里用的(或取当页开始的记录标识编号)25
intlimit=int.Parse(Request.Form["limit"]+"");//或取每页记录数26
stringsort=Request.Form["sort"]+"";//或取排序方向27
stringdir=Request.Form["dir"]+"";//或取所要排序的字段名28
GetJsonSouceString(start,limit,sort,dir);29
}30

31
privatevoidGetJsonSouceString(intstart,intlimit,stringsort,stringdir)32


{33
ProjectBaseInfoDataContextdb=newProjectBaseInfoDataContext();34
varquery=frompindb.PROJECT_BASE_INFOs35

selectnew
{p.PROJECT_NO,p.PROJECT_NAME,p.PROJECT_DEPT_NO,p.PROJECT_MANAGER,p.PROJECT_CURRENT_STATUS,PROJECT_START_DATE=p.PROJECT_START_DATE+"",PROJECT_FINISH_DATE=p.PROJECT_FINISH_DATE+"",PROJECT_REAL_START_DATE=p.PROJECT_REAL_START_DATE+"",PROJECT_REAL_FINISH_DATE=p.PROJECT_REAL_FINISH_DATE+"",p.PROJECT_ALIAS,p.PROJECT_TYPE,p.PROJECT_LEADER,p.PROJECT_MEMO};//类似PROJECT_REAL_FINISH_DATE=p.PROJECT_REAL_FINISH_DATE+"的处理了Grid中日期格式显示的问题36

排序字段和排序方向#region排序字段和排序方向37
if(sort!=""&&dir!="")38


{39
switch(sort)40


{41
case"PROJECT_NO":42
if(dir=="ASC")43


{44
query=query.OrderBy(p=>p.PROJECT_NO);45
}46
else47


{48
query=query.OrderByDescending(p=>p.PROJECT_NO);49
}50
break;51
case"PROJECT_NAME":52
if(dir=="ASC")53


{54
query=query.OrderBy(p=>p.PROJECT_NAME);55
}56
else57


{58
query=query.OrderByDescending(p=>p.PROJECT_NAME);59
}60
break;61
case"PROJECT_DEPT_NO":62
if(dir=="ASC")63


{64
query=query.OrderBy(p=>p.PROJECT_DEPT_NO);65
}66
else67


{68
query=query.OrderByDescending(p=>p.PROJECT_DEPT_NO);69
}70
break;71
case"PROJECT_MANAGER":72
if(dir=="ASC")73


{74
query=query.OrderBy(p=>p.PROJECT_MANAGER);75
}76
else77


{78
query=query.OrderByDescending(p=>p.PROJECT_MANAGER);79
}80
break;81
case"PROJECT_CURRENT_STATUS":82
if(dir=="ASC")83


{84
query=query.OrderBy(p=>p.PROJECT_CURRENT_STATUS);85
}86
else87


{88
query=query.OrderByDescending(p=>p.PROJECT_CURRENT_STATUS);89
}90
break;91
case"PROJECT_START_DATE":92
if(dir=="ASC")93


{94
query=query.OrderBy(p=>p.PROJECT_START_DATE);95
}96
else97


{98
query=query.OrderByDescending(p=>p.PROJECT_START_DATE);99
}100
break;101
case"PROJECT_FINISH_DATE":102
if(dir=="ASC")103


{104
query=query.OrderBy(p=>p.PROJECT_FINISH_DATE);105
}106
else107


{108
query=query.OrderByDescending(p=>p.PROJECT_FINISH_DATE);109
}110
break;111
case"PROJECT_REAL_START_DATE":112
if(dir=="ASC")113


{114
query=query.OrderBy(p=>p.PROJECT_REAL_START_DATE);115
}116
else117


{118
query=query.OrderByDescending(p=>p.PROJECT_REAL_START_DATE);119
}120
break;121
case"PROJECT_REAL_FINISH_DATE":122
if(dir=="ASC")123


{124
query=query.OrderBy(p=>p.PROJECT_REAL_FINISH_DATE);125
}126
else127


{128
query=query.OrderByDescending(p=>p.PROJECT_REAL_FINISH_DATE);129
}130
break;131
default:132
break;133
}134
}135
#endregion136

137
intiCount=query.Count();//所要记录数138
intPageNum=start/limit;//共有页数139
intPageSize=limit;140
query=query.Skip(PageSize*PageNum).Take(PageSize);//当前页记录141
stringJsonSource=query.ToJSON();//当前页记录转成JSON格式142
strJsonSource=@"{""totalCount"":"""+iCount+"";143
strJsonSource=strJsonSource+@""",""data"":"+JsonSource+"}";//Grid的分页区显示所有记录数增加totalCount信息144
}145
}146
}147
ProjectBaseInfo.aspx中的代码为:
ProjectBaseInfo.aspx.cs " Inherits = " Web.Projects.
JsonDataSource.ProjectBaseInfo " %>
<%= strJsonSource %>
至此,已完成了取数据源。
2.页面客户端
(1)下载ExtJS库,请访问:http://extjs.com/。
(2)在你的WEB工程中建一个ExtJS目录。把下载的包里的目录都COPY进来(为了简便起见)。
(3)建一个ProjectLists.html页面,代码如下:
<!--<br /><br /> <br /><br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /><br /> <a href="http://www.CodeHighlighter.com/" title="http://www.CodeHighlighter.com/">http://www.CodeHighlighter.com/</a><br /><br /> <br /><br /> -->1
<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">2
<htmlxmlns="http://www.w3.org/1999/xhtml">3
<headrunat="server">4
<title>项目一览表</title>5
<metahttp-equiv="Content-Type"content="text/html;charset=gb2312">6
<linkrel="stylesheet"type="text/css"href="../Resources/css/ext-all.css"/>7
<!--GC-->8
<!--LIBS-->9
<scripttype="text/javascript"src="../Adapter/ext/ext-base.js"></script>10
<!--ENDLIBS-->11
<scripttype="text/javascript"src="../Script/ext-all.js"></script>12

13
<scripttype="text/javascript"src="../Script/GridForProjectLists.js"></script>14

15
<linkrel="stylesheet"type="text/css"href="../CSS/Grid.css"/>16
<linkrel="stylesheet"type="text/css"href="../CSS/Forms.css"/>17
<linkrel="stylesheet"type="text/css"href="../CSS/Combos.css"/>18
<!--CommonStylesfortheProjects-->19

<styletype="text/css">
20
body.x-panel21

{
}{22
margin-bottom:20px;23
}24
.icon-grid25

{
}{26
background-image:url(../Images/icons/grid.png)!important;27
}28
#button-grid.x-panel-body29

{
}{30
border:1pxsolid#99bbe8;31
border-top:0none;32
}33
.add34

{
}{35
background-image:url(../Images/icons/add.gif)!important;36
}37
.search38

{
}{39
background-image:url(../Images/icons/plugin.gif)!important;40
}41
.remove42

{
}{43
background-image:url(../Images/icons/delete.gif)!important;44
}45
.save46

{
}{47
background-image:url(../Images/icons/save.gif)!important;48
}49
.ext-mb-save50

{
}{51
background:transparenturl(../Images/download.gif)no-repeattopleft;52
height:46px;53
}54
</style>55
</head>56

57
<body>58
</body>59
</html>
(注:请注意JS引用的路径)
(1)新建GridForProjectLists.js文件(这个才是核心
)
代码如下:
<!--<br /><br /> <br /><br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /><br /> <a href="http://www.CodeHighlighter.com/" title="http://www.CodeHighlighter.com/">http://www.CodeHighlighter.com/</a><br /><br /> <br /><br /> -->1

/**//*2
*ExtJSLibrary2.0Beta13
*Copyright(c)2006-2007,ExtJS,LLC.4
*licensing@extjs.com5
*6
*http://extjs.com/license7
*/8

Ext.onReady(function()
{9
varwin;10
varnewwin;11
Ext.QuickTips.init();12
//createtheDataStore13

vards=newExt.data.GroupingStore(
{14
//loadusingscripttagsforcrossdomain,ifthedatainonthesamedomainas15
//thispage,anHttpProxywouldbebetter16

proxy:newExt.data.HttpProxy(
{17
url:'../Projects/JsonDataSource/ProjectBaseInfo.aspx'18
}),19

20
//createreaderthatreadstheprojectrecords21

reader:newExt.data.JsonReader(
{22
root:'data',23
totalProperty:'totalCount'24
},[25


{name:'PROJECT_NO',type:'string'},26


{name:'PROJECT_NAME',type:'string'},27


{name:'PROJECT_ALIAS',type:'string'},28


{name:'PROJECT_DEPT_NO',type:'string'},29


{name:'PROJECT_MANAGER',type:'string'},30


{name:'PROJECT_LEADER',type:'string'},31


{name:'PROJECT_CURRENT_STATUS',type:'string'},32


{name:'PROJECT_START_DATE',type:'date'},33


{name:'PROJECT_FINISH_DATE',type:'date'},34


{name:'PROJECT_REAL_START_DATE',type:'date'},35


{name:'PROJECT_REAL_FINISH_DATE',type:'date'},36


{name:'PROJECT_MEMO',type:'string'}37
]),38
//groupField:'PROJECT_DEPT_NO',39
remoteSort:true40
});41
ds.setDefaultSort('PROJECT_NAME','desc');42

43
//pluggablerenders44

functionrenderProject(value,p,record)
{45

46
returnString.format(47
'<imgborder=0src="../Images/icons/application_view_list.png"id="btnView_{0}"style="cursor:hand"alt="浏览"> <ahref="ProjectDetail.aspx?ProjectNo={0}"target="_blank"><imgborder=0src="../Images/icons/application_view_list.png"style="cursor:hand"alt="编辑"></a> <ahref="ProjectDetail.aspx?ProjectNo={0}"target="_blank"><imgborder=0src="../Images/icons/cross.gif"style="cursor:hand"alt="删除"></a>',48
record.data.PROJECT_NO);49
}50

51
//thecolumnmodelhasinformationaboutgridcolumns52
//dataIndexmapsthecolumntothespecificdatafieldin53
//thedatastore54
varnm=newExt.grid.RowNumberer();55
varsm=newExt.grid.CheckboxSelectionModel();//addcheckboxcolumn56
varcm=newExt.grid.ColumnModel([nm,sm,57


{id:'PROJECT_NO',header:"项目编号",dataIndex:'PROJECT_NO',width:40,align:'center'},58


{header:"项目名称",dataIndex:'PROJECT_NAME',width:100,align:'left'},//,renderer:renderProject},59


{header:"项目简称",dataIndex:'PROJECT_ALIAS',width:50,align:'left'},60


{header:"部门",dataIndex:'PROJECT_DEPT_NO',width:50,align:'center'},61


{header:"项目经理",dataIndex:'PROJECT_MANAGER',width:40,align:'center'},62


{header:"开发经理",dataIndex:'PROJECT_LEADER',width:40,align:'center'},63


{header:"当前状态",dataIndex:'PROJECT_CURRENT_STATUS',width:40,align:'center'},64


{header:"预计开始日期",renderer:Ext.util.Format.dateRenderer('Y-m-d'),dataIndex:'PROJECT_START_DATE',width:50,align:'center'},65


{header:"预计结束日期",renderer:Ext.util.Format.dateRenderer('Y-m-d'),dataIndex:'PROJECT_FINISH_DATE',width:50,align:'center'},66


{header:"实际开始日期",renderer:Ext.util.Format.dateRenderer('Y-m-d'),dataIndex:'PROJECT_REAL_START_DATE',width:50,align:'center'},67


{header:"实际结束日期",renderer:Ext.util.Format.dateRenderer('Y-m-d'),dataIndex:'PROJECT_REAL_FINISH_DATE',width:50,align:'center'},68


{header:"备注",dataIndex:'PROJECT_MEMO',width:50,align:'left'},69


{id:'PROJECT_NO',header:"操作",dataIndex:'PROJECT_NO',width:60,align:'center',renderer:renderProject,sortable:false}70
]);71

72
//hidecolumn73
cm.setHidden(4,!cm.isHidden(4));//隐藏项目简称列74
cm.setHidden(7,!cm.isHidden(7));//隐藏开发经理列75
cm.setHidden(13,!cm.isHidden(13));//隐藏备注列76
//bydefaultcolumnsaresortable77
cm.defaultSortable=true;78

vargdProjects=newExt.grid.GridPanel(
{79
frame:true,80
collapsible:true,81
animCollapse:false,82
//el:'projects-grid',83
width:965,84
height:530,85
title:'项目一览表',86
iconCls:'icon-grid',87
renderTo:document.body,88
store:ds,89
cm:cm,90
sm:sm,91
trackMouseOver:true,92

loadMask:
{msg:'正在加载数据,请稍侯……'},93
//loadMask:true,94

viewConfig:
{95
forceFit:true,96
enableRowBody:true,97

getRowClass:function(record,rowIndex,p,ds)
{98
return'x-grid3-row-collapsed';99
}100
},101

view:newExt.grid.GroupingView(
{102
forceFit:true,103

groupTextTpl:'
{text}(
{[values.rs.length]}条记录)'104
}),105

bbar:newExt.PagingToolbar(
{106
pageSize:25,107
store:ds,108
displayInfo:true,109

displayMsg:'当前显示
{0}-
{1}条记录/共
{2}条记录',110
emptyMsg:"无显示数据"111
}),112
//inlinetoolbars113

tbar:[
{114
id:'btnAdd',115
text:'新增',116
tooltip:'新增',117
iconCls:'add',118
handler:showAddPanel119

},'-',
{120
text:'查询',121
tooltip:'查询',122
iconCls:'search'123

},'-',
{124
text:'批量删除',125
tooltip:'删除',126
iconCls:'remove',127
handler:showDelDialog128
}]129

130
});131

132
});
展示成果:
至此,本文已实现Grid的数据显示、分页、排序的功能。常见的CRUD四个功能的R已完成,接下来,我将提供CUD的功能(如form提交等动作),未完待续……
本文介绍如何使用ExtJS实现带有分页和排序功能的Grid组件,包括.NET后端的数据处理和前端页面的具体实现。
135

被折叠的 条评论
为什么被折叠?



