由于在项目中需要一个树形控件展示我的目录结构,最终选择了extjs,第一次接触花了1天时间学习先将成果列出来,以备后查.
1.把ext包下的adapter,resource两个目录和ext-all.js文件包含到工程中
2.在需要放置树的页面的头部包含相关的css和js文件,注意顺序
1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2 <html xmlns="http://www.w3.org/1999/xhtml">
3 <head runat="server">
4 <title>产品展示</title>
5 <link href="css/main.css" rel="stylesheet" type="text/css">
6 <link href="css/tab_style.css" rel="stylesheet" type="text/css">
7
8 <script language="javascript" src="javascript/product_index.js"></script>
9
10 <link rel="stylesheet" type="text/css" href="./Extjs/resources/css/ext-all.css" />
11 <!-- GC -->
12 <!-- LIBS -->
13
14 <script type="text/javascript" src="./Extjs/adapter/ext/ext-base.js"></script>
15
16 <!-- ENDLIBS -->
17
18 <script type="text/javascript" src="./Extjs/ext-all-debug.js"></script>
19
20 <script type="text/javascript" src="./javascript/CategoryMenu.js"></script>
21
22 </head>
23 <body>
24 <form id="form1" runat="server">
25 <mp6:top_music runat="server" ID="txtDisplayOrder"></mp6:top_music>
26 <div id="main">
27 <div id="c_left">
28 <div id="CategoryMenuTree" style="overflow: auto; margin-right: 8px; height: 300px;
29 width: 192px; border: 1px solid #c3daf9;">
30 </div>
31 </div>
32 <div class="product_show" id="maincontaint">
33 <iframe id="productDetail" name="productDetail" src="CategoryDetailShow.aspx?categoryid=1"
34 frameborder="0" style="border: solid 1px #e3e2e2; width: 756px; height: 450px;
35 padding: 0; margin: 0;"></iframe>
36 </div>
37 </div>
38 </form>
39 </body>
40 </html>
3 <head runat="server">
4 <title>产品展示</title>
5 <link href="css/main.css" rel="stylesheet" type="text/css">
6 <link href="css/tab_style.css" rel="stylesheet" type="text/css">
7
8 <script language="javascript" src="javascript/product_index.js"></script>
9
10 <link rel="stylesheet" type="text/css" href="./Extjs/resources/css/ext-all.css" />
11 <!-- GC -->
12 <!-- LIBS -->
13
14 <script type="text/javascript" src="./Extjs/adapter/ext/ext-base.js"></script>
15
16 <!-- ENDLIBS -->
17
18 <script type="text/javascript" src="./Extjs/ext-all-debug.js"></script>
19
20 <script type="text/javascript" src="./javascript/CategoryMenu.js"></script>
21
22 </head>
23 <body>
24 <form id="form1" runat="server">
25 <mp6:top_music runat="server" ID="txtDisplayOrder"></mp6:top_music>
26 <div id="main">
27 <div id="c_left">
28 <div id="CategoryMenuTree" style="overflow: auto; margin-right: 8px; height: 300px;
29 width: 192px; border: 1px solid #c3daf9;">
30 </div>
31 </div>
32 <div class="product_show" id="maincontaint">
33 <iframe id="productDetail" name="productDetail" src="CategoryDetailShow.aspx?categoryid=1"
34 frameborder="0" style="border: solid 1px #e3e2e2; width: 756px; height: 450px;
35 padding: 0; margin: 0;"></iframe>
36 </div>
37 </div>
38 </form>
39 </body>
40 </html>
3.代码中已经可以看到树控件使用的脚本文件
<script type="text/javascript" src="./javascript/CategoryMenu.js"></script>
4.我们在相应的目录下生成这个 CategoryMenu.js文件
1 /*!
2 * Ext JS Library 3.3.1
3 * Copyright(c) 2006-2010 Sencha Inc.
4 * licensing@sencha.com
5 * http://www.sencha.com/license
6 */
7 Ext.onReady(function(){
8 // shorthand
9 var Tree = Ext.tree;
10 var loader = new Tree.TreeLoader({dataUrl:'GetCategoryMenuTree.aspx'});
11 loader.processResponse = function(response, node, callback){
12 var json = response.responseText;
13 try{
14 node.beginUpdate();
15 var o = eval("("+json+")");
16 for(var i=0, len=o.length; i<len; i++){
17 o[i]["text"] = unescape(o[i]["text"]);
18 var n = this.createNode(o[i]);
19 if (n){
20 node.appendChild(n);
21 }
22 }
23 node.endUpdate();
24 if(typeof callback == "function"){
25 callback(this, node);
26 }
27
28 }catch(e){
29 this.handleFailure(response);
30 }
31 }
32 var menuTree = new Tree.TreePanel({
33 useArrows: true,
34 autoScroll: true,
35 animate: true,
36 enableDD: false,
37 containerScroll: true,
38 border: false,
39 height: 300,
40 rootVisible: true,
41 loader:loader
42 });
43
44 var root = new Tree.AsyncTreeNode({
45 text: '全部分类',
46 draggable:false,
47 id:'0'
48 });
49
50 menuTree.setRootNode(root);
51
52 // render the tree
53 menuTree.render('CategoryMenuTree');
54
55 // var menucontext = new Ext.menu.Menu({
56 // id: 'menucontext',
57 // items: [{
58 // text: '点我呀',
59 // handler:function(){
60 // alert('aaaaaaaaaaaaaaaaaaaa');
61 // }
62 // }]
63 // });
64 //
65 // menuTree.on("contextmenu", function(node,e){
66 // e.preventDefault();
67 // node.select();
68 // menucontext.showAt(e.getXY());
69 // });
70
71 // tree.on("click", function(node){
72 // Ext.Msg.show({
73 // title:'提示',
74 // msg:'你单击了' + node,
75 // animEl:node.ui.textNode
76 // });
77 // });
78
79 Ext.QuickTips.init();
80
81 root.expand(false,false, function(){
82 locationTree(menuTree.getRootNode());
83 });
84
85 root.expand(false,false);
86
87 });
88
89 function locationTree(node){
90 node.childNodes[0].select();
91 //Ext.get('productDetail').src="CategoryDetailShow.aspx?categoryid=1";
92
93 }
3 * Copyright(c) 2006-2010 Sencha Inc.
4 * licensing@sencha.com
5 * http://www.sencha.com/license
6 */
7 Ext.onReady(function(){
8 // shorthand
9 var Tree = Ext.tree;
10 var loader = new Tree.TreeLoader({dataUrl:'GetCategoryMenuTree.aspx'});
11 loader.processResponse = function(response, node, callback){
12 var json = response.responseText;
13 try{
14 node.beginUpdate();
15 var o = eval("("+json+")");
16 for(var i=0, len=o.length; i<len; i++){
17 o[i]["text"] = unescape(o[i]["text"]);
18 var n = this.createNode(o[i]);
19 if (n){
20 node.appendChild(n);
21 }
22 }
23 node.endUpdate();
24 if(typeof callback == "function"){
25 callback(this, node);
26 }
27
28 }catch(e){
29 this.handleFailure(response);
30 }
31 }
32 var menuTree = new Tree.TreePanel({
33 useArrows: true,
34 autoScroll: true,
35 animate: true,
36 enableDD: false,
37 containerScroll: true,
38 border: false,
39 height: 300,
40 rootVisible: true,
41 loader:loader
42 });
43
44 var root = new Tree.AsyncTreeNode({
45 text: '全部分类',
46 draggable:false,
47 id:'0'
48 });
49
50 menuTree.setRootNode(root);
51
52 // render the tree
53 menuTree.render('CategoryMenuTree');
54
55 // var menucontext = new Ext.menu.Menu({
56 // id: 'menucontext',
57 // items: [{
58 // text: '点我呀',
59 // handler:function(){
60 // alert('aaaaaaaaaaaaaaaaaaaa');
61 // }
62 // }]
63 // });
64 //
65 // menuTree.on("contextmenu", function(node,e){
66 // e.preventDefault();
67 // node.select();
68 // menucontext.showAt(e.getXY());
69 // });
70
71 // tree.on("click", function(node){
72 // Ext.Msg.show({
73 // title:'提示',
74 // msg:'你单击了' + node,
75 // animEl:node.ui.textNode
76 // });
77 // });
78
79 Ext.QuickTips.init();
80
81 root.expand(false,false, function(){
82 locationTree(menuTree.getRootNode());
83 });
84
85 root.expand(false,false);
86
87 });
88
89 function locationTree(node){
90 node.childNodes[0].select();
91 //Ext.get('productDetail').src="CategoryDetailShow.aspx?categoryid=1";
92
93 }
这个树使用[GetCategoryMenuTree.aspx] 作为异步树的数据源,该页面的后台代码返回一个json字符串,客户端使用该数据构建树的节点.
1 public partial class GetCategoryMenuTree : System.Web.UI.Page
2 {
3 protected void Page_Load(object sender, EventArgs e)
4 {
5 string nodeTpl = "id:'{0}', text:'{1}', cls:'{2}', qtip:'{3}', href:'CategoryDetailShow.aspx?categoryid={4}',hrefTarget:'productDetail'";
6 string leafTpl = "id:'{0}', text:'{1}', cls:'{2}', qtip:'{3}', leaf:'{4}'";
7 string leafTpl2 = "id:'{0}', text:'{1}', cls:'{2}', qtip:'{3}', leaf:'{4}', href:'ProductInCategoryShow.aspx?categoryid={5}',hrefTarget:'productDetail'";
8
9 string jsonTpl = "[{0}]";
10
11 string json = "";
12
13 int nodeID = 0;
14 try
15 {
16 nodeID = int.Parse(Request.Params["node"]);
17 }
18 catch (Exception ex)
19 {
20 Response.Write("[]");
21 Response.End();
22 return;
23 }
24 CategoryCollection categorys = CategoryManager.GetAllCategories(nodeID);
25 foreach (Category category in categorys)
26 {
27 string node = "";
28 string Name = category.Name;
29 Name = Microsoft.JScript.GlobalObject.escape(Name);
30
31 if (CategoryManager.hasChildren(category.CategoryID))
32 {
33 node = string.Format(nodeTpl,
34 category.CategoryID,
35 Name,
36 "folder",
37 "categroyid:[" + category.CategoryID.ToString() + "]",
38 category.CategoryID);
39 }
40 else
41 {
42 // 叶子节点
43 node = string.Format(leafTpl2,
44 category.CategoryID,
45 Name,
46 "folder",
47 "categroyid:[" + category.CategoryID.ToString() + "]",
48 "true",
49 category.CategoryID);
50
51 //ProductCategoryCollection pcc = CategoryManager.GetProductCategoriesByCategoryID(category.CategoryID);
52 //if (pcc != null && pcc.Count > 0)
53 //{
54 // node = string.Format(leafTpl2,
55 // category.CategoryID,
56 // category.Name,
57 // "folder",
58 // "categroyid:[" + category.CategoryID.ToString() + "]",
59 // "true",
60 // category.CategoryID);
61
62 //}
63 //else
64 //{
65 // node = string.Format(leafTpl,
66 // category.CategoryID,
67 // category.Name,
68 // "folder",
69 // "categroyid:[" + category.CategoryID.ToString() + "]",
70 // "true");
71 //}
72 }
73 if (!string.IsNullOrEmpty(json))
74 {
75 json += ",";
76 }
77 json += "{" + node + "}";
78 }
79 json = string.Format(jsonTpl, json);
80
81 Response.Write(json);
82 Response.End();
83 }
84 }
3 protected void Page_Load(object sender, EventArgs e)
4 {
5 string nodeTpl = "id:'{0}', text:'{1}', cls:'{2}', qtip:'{3}', href:'CategoryDetailShow.aspx?categoryid={4}',hrefTarget:'productDetail'";
6 string leafTpl = "id:'{0}', text:'{1}', cls:'{2}', qtip:'{3}', leaf:'{4}'";
7 string leafTpl2 = "id:'{0}', text:'{1}', cls:'{2}', qtip:'{3}', leaf:'{4}', href:'ProductInCategoryShow.aspx?categoryid={5}',hrefTarget:'productDetail'";
8
9 string jsonTpl = "[{0}]";
10
11 string json = "";
12
13 int nodeID = 0;
14 try
15 {
16 nodeID = int.Parse(Request.Params["node"]);
17 }
18 catch (Exception ex)
19 {
20 Response.Write("[]");
21 Response.End();
22 return;
23 }
24 CategoryCollection categorys = CategoryManager.GetAllCategories(nodeID);
25 foreach (Category category in categorys)
26 {
27 string node = "";
28 string Name = category.Name;
29 Name = Microsoft.JScript.GlobalObject.escape(Name);
30
31 if (CategoryManager.hasChildren(category.CategoryID))
32 {
33 node = string.Format(nodeTpl,
34 category.CategoryID,
35 Name,
36 "folder",
37 "categroyid:[" + category.CategoryID.ToString() + "]",
38 category.CategoryID);
39 }
40 else
41 {
42 // 叶子节点
43 node = string.Format(leafTpl2,
44 category.CategoryID,
45 Name,
46 "folder",
47 "categroyid:[" + category.CategoryID.ToString() + "]",
48 "true",
49 category.CategoryID);
50
51 //ProductCategoryCollection pcc = CategoryManager.GetProductCategoriesByCategoryID(category.CategoryID);
52 //if (pcc != null && pcc.Count > 0)
53 //{
54 // node = string.Format(leafTpl2,
55 // category.CategoryID,
56 // category.Name,
57 // "folder",
58 // "categroyid:[" + category.CategoryID.ToString() + "]",
59 // "true",
60 // category.CategoryID);
61
62 //}
63 //else
64 //{
65 // node = string.Format(leafTpl,
66 // category.CategoryID,
67 // category.Name,
68 // "folder",
69 // "categroyid:[" + category.CategoryID.ToString() + "]",
70 // "true");
71 //}
72 }
73 if (!string.IsNullOrEmpty(json))
74 {
75 json += ",";
76 }
77 json += "{" + node + "}";
78 }
79 json = string.Format(jsonTpl, json);
80
81 Response.Write(json);
82 Response.End();
83 }
84 }
5.到这里我的这个树就做好了