1)default.aspx前台代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ExtjsTreeDemo._Default" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title></title> <link type="text/css" rel="Stylesheet" href="Extjs3.2.0/resources/css/ext-all.css" /> <script language="javascript" type="text/javascript" src="Extjs3.2.0/adapter/ext/ext-base.js"></script> <script language="javascript" type="text/javascript" src="Extjs3.2.0/ext-all.js"></script> <script language="javascript" type="text/javascript"> Ext.onReady(initTreePanel); function initTreePanel() { //建立根 var root = new Ext.tree.AsyncTreeNode( { id: '0', text: '家谱' }); //建立树 var tree = new Ext.tree.TreePanel({ renderTo: 'div_tree', id: 'tree', autoScroll: true, border: true, width: 150, height: 500, useArrows: true, lines: true, animate: true, enableDD: true, containerScroll: true, rootVisible: true, root: root, loader: new Ext.tree.TreeLoader({ url: 'ServletHandlers/GetTrees.ashx' }), listeners: { 'contextmenu': function(node, e) { node.select(); e.preventDefault(); //关闭右键默认菜单 var nodemenu = new Ext.menu.Menu({ items: [{ text: '添加节点', //id: 'addNode',//添加的话右击菜单只能显示一次 icon: 'Extjs3.2.0/resources/images/default/tree/drop-add.gif', handler: function() { Ext.Msg.prompt('请输入新节点名称:', '', function(e, text) { if (e == 'ok') { if (text == null || text == '') { Ext.Msg.alert('提示', '添加失败!节点名不能为空!'); } else { //执行添加 Ext.Ajax.request({ url: 'ServletHandlers/TreeHandler.ashx?type=add&parentId=' + node.id + '&text=' + text, success: function(request) { Ext.Msg.alert('执行结果:', '成功了!', function(e, text) { if (e == 'ok') { //tree.root.reload(); //数据重新加载 //tree.root.expand(true, false); window.location.href = window.location.href; } }); }, failure: function() { Ext.Msg.alert('执行结果:', '失败了!'); } }) } } }) } }, { text: '删除节点', //id: 'delNode', icon: 'Extjs3.2.0/resources/images/default/tree/drop-no.gif', handler: function() { Ext.Msg.confirm('提示:', '确认删除?', function(btn) { if (btn == 'yes') { //执行删除 Ext.Ajax.request({ url: 'ServletHandlers/TreeHandler.ashx?type=del&parentId=' + node.id + '&text=' + node.attributes.text, success: function(request) { Ext.Msg.alert('执行结果:', '成功了!', function(e, text) { if (e == 'ok') { //tree.root.reload(); //数据重新加载 //tree.root.expand(true, false); window.location.href = window.location.href; } }); }, failure: function() { Ext.Msg.alert('执行结果:', '失败了!'); } }) } }); } }, { text: '修改节点', //id: 'editNode', icon: 'Extjs3.2.0/resources/images/default/tree/leaf.gif', handler: function() { Ext.Msg.prompt('请输入修改后的节点名称:', '', function(e, text) { if (e == 'ok') { if (text == null || text == '') { Ext.Msg.alert('提示', '修改失败!节点名不能为空!'); } else { //执行修改 Ext.Ajax.request({ url: 'ServletHandlers/TreeHandler.ashx?type=edit&parentId=' + node.id + '&text=' + text, success: function(request) { Ext.Msg.alert('执行结果:', '成功了!', function(e, text) { if (e == 'ok') { //tree.root.reload(); //数据重新加载 //tree.root.expand(true, false); window.location.href = window.location.href; } }); }, failure: function() { Ext.Msg.alert('执行结果:', '失败了!'); } }) } } }) } }] }); nodemenu.showAt(e.getPoint()); } } }); //单击事件 tree.on('click', function(node, e) { e.stopEvent(); if (!node.isExpandable()) { //提交到页面处理 Ext.MessageBox.alert('测试', node.id); } }) tree.expandAll();// 加载自动显示展开节点 } </script> </head> <body> <form id="form1" runat="server"> <div id="div_tree"> </div> </form> </body> </html>
2)GetTrees.ashx 代码
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; using System.Text; using System.Configuration; namespace ExtjsTreeDemo.ServletHandlers { /// <summary> /// $codebehindclassname$ 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class GetTrees : IHttpHandler { private string TreeDemoConnectionString = ConfigurationManager.ConnectionStrings["TreeDemoConnectionString"].ConnectionString; DataClassesDataContext dc = null; public void ProcessRequest(HttpContext context) { dc = new DataClassesDataContext(TreeDemoConnectionString); string str = GetParentNodeString(0); context.Response.ContentType = "text/plain"; context.Response.Write(str); } /// <summary> /// 获取父节点 /// </summary> /// <returns></returns> private string GetParentNodeString(int id) { int counter= 1; IQueryable<TreeNodes> nodes=dc.TreeNodes.Where(u=>u.parentId==id); StringBuilder sb = new StringBuilder(); if (nodes != null && nodes.Count() != 0) { sb.Append("["); foreach (TreeNodes node in nodes) { sb.Append("{"); sb.Append("id:'" + node.id + "'"); sb.Append(",text:'" + node.text + "'"); sb.Append(GetSubNodeString(node.id)); sb.Append("}"); if (counter < nodes.Count()) { sb.Append(","); } counter++; } sb.Append("]"); } return sb.ToString(); } /// <summary> /// 获取子节点 /// </summary> /// <param name="id"></param> /// <returns></returns> private string GetSubNodeString(int id) { int counter = 1; IQueryable<TreeNodes> nodes = dc.TreeNodes.Where(u => u.parentId == id); StringBuilder sb = new StringBuilder(); if (nodes != null & nodes.Count() != 0) { sb.Append(",children: ["); foreach (TreeNodes node in nodes) { sb.Append("{"); sb.Append("id:'" + node.id + "'"); sb.Append(",text:'" + node.text + "'"); sb.Append(GetSubNodeString(node.id)); sb.Append("}"); if (counter < nodes.Count()) { sb.Append(","); } counter++; } sb.Append("]"); } else { sb.Append(",leaf: true"); //sb.Append(",href:'http://www.baidu.com?id="+id+"'"); //sb.Append(",hrefTarget:'_blank'"); } return sb.ToString(); } public bool IsReusable { get { return false; } } } }
3)TreeHandler.ashx代码
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; using System.Configuration; using System.Data.Linq; namespace ExtjsTreeDemo.ServletHandlers { /// <summary> /// $codebehindclassname$ 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] public class TreeHandler : IHttpHandler { private string TreeDemoConnectionString = ConfigurationManager.ConnectionStrings["TreeDemoConnectionString"].ConnectionString; DataClassesDataContext dc = null; public void ProcessRequest(HttpContext context) { dc = new DataClassesDataContext(TreeDemoConnectionString); string type = ""; int parentId = 0; string text = ""; if (context.Request.QueryString["type"] != null) { type = context.Request.QueryString["type"].ToString(); } if (context.Request.QueryString["parentId"] != null) { string strId = context.Request.QueryString["parentId"].ToString(); parentId = Convert.ToInt32(strId); } if (context.Request.QueryString["text"] != null) { text = context.Request.QueryString["text"].ToString(); } if (type == "add") { TreeNodes node = new TreeNodes(); node.text = text; node.parentId = parentId; bool flag = AddNode(node); } else if (type == "del") { TreeNodes node = GetNode(parentId); if (node != null) { bool flag = DelNode(node); DelNodesEvent(parentId); } } else { TreeNodes node = GetNode(parentId); bool flag = EditNode(node, text); } context.Response.ContentType = "text/plain"; context.Response.Write("response"); } /// <summary> /// 递归删除所有的字节点 /// </summary> /// <param name="parentId"></param> private void DelNodesEvent(int parentId) { IQueryable<TreeNodes> nodes = GetNodes(parentId); if (nodes != null && nodes.Count() != 0) { foreach (TreeNodes node in nodes) { DelNodesEvent(node.id); } DelNodes(nodes); } } /// <summary> /// 根据id获取节点 /// </summary> /// <param name="id"></param> /// <returns></returns> private TreeNodes GetNode(int id) { TreeNodes node = null; node=dc.TreeNodes.SingleOrDefault(u => u.id == id); return node; } /// <summary> /// 根据parentId删除多个节点 /// </summary> /// <param name="parentId"></param> /// <returns></returns> private IQueryable<TreeNodes> GetNodes(int parentId) { IQueryable<TreeNodes> nodes = null; nodes = dc.TreeNodes.Where(u => u.parentId == parentId); return nodes; } /// <summary> /// 添加节点 /// </summary> /// <param name="node"></param> /// <returns></returns> private bool AddNode(TreeNodes node) { bool flag = false; try { dc.TreeNodes.InsertOnSubmit(node); dc.SubmitChanges(); flag = true; } catch (Exception ex) { flag = false; } return flag; } /// <summary> /// 删除节点 /// </summary> /// <param name="node"></param> /// <returns></returns> private bool DelNode(TreeNodes node) { bool flag = false; try { dc.TreeNodes.DeleteOnSubmit(node); dc.SubmitChanges(); } catch (Exception ex) { flag = false; } return flag; } /// <summary> /// 删除多个节点 /// </summary> /// <param name="nodes"></param> /// <returns></returns> private bool DelNodes(IQueryable<TreeNodes> nodes) { bool flag = false; try { dc.TreeNodes.DeleteAllOnSubmit(nodes); dc.SubmitChanges(); } catch (Exception ex) { flag = false; } return flag; } /// <summary> /// 修改 /// </summary> /// <param name="node"></param> /// <param name="text"></param> /// <returns></returns> private bool EditNode(TreeNodes node, string text) { bool flag = false; node.text = text; try { dc.SubmitChanges(); flag = true; } catch (Exception ex) { flag = false; } return flag; } public bool IsReusable { get { return false; } } } }