1. 程式人生 > >Ext 樹型選單(增刪改查)

Ext 樹型選單(增刪改查)

首先看資料庫的構造:

第一個是總的類別表(例表1[emergencytype]),此表中存放的是總的類別表,理論是不可編輯的,表中詳細資訊見表1-1.

第二個是總的分類別表下的小類別(例表2[emergencyworkflow]),所做的主要操作,是對錶2的增刪改查.表中詳細資訊見表2-2.

首先

   表1:

       

   表1-1:

     

   表2:

    

   表2-2:

    

首先是根據表的結構的結構生成樹:

var treeloader=new Ext.tree.TreeLoader({dataUrl:'tree.aspx?action=getAll'});

var tree=new Ext.tree.TreePanel({

autoWidth:true,

autoHeight:true,

animate:false,//開啟動畫效果

enableDD:false,//不允許子節點拖動

rootVisible:false,

loader:treeloader

});

tree.on('dblclick',function(node,e){nodeClickEvent(node);});

tree.on('contextmenu', contextmenu, tree);

//定義樹的跟節點

var root=new Ext.tree.AsyncTreeNode({

draggable:false, //不能拖放

expanded :true

});

tree.setRootNode(root);

tree.expandAll(); //設定的是全部展開.

其中contextmenu設定的是樹形節點的右擊選單,方法如下:

function contextmenu(node, e) {

// if(node.getDepth() > 1)

// {

var treeMenu = new Ext.menu.Menu( {

items : [

new Ext.menu.Item( {

text : '新增',

icon:'../../Image/Workflow/ICO/TTWeather.ico',

handler : addTreeNode.createCallback(node)

}),

new Ext.menu.Item( {

text : '新增子項',

icon:'../../Image/Workflow/ICO/LowPriority.ico',

handler : addChildTreeNode.createCallback(node)

}),

new Ext.menu.Item( {

text : '刪除',

icon:'../../Image/Workflow/ICO/exit.ico',

handler : deleteTreeNode.createCallback(node)

}),

new Ext.menu.Item( {

text : '重新命名',

icon:'../../Image/Workflow/ICO/favicon.ico',

handler : renameTreeNode.createCallback(node)

})

]

});

treeMenu.showAt(e.getXY());

// }

}

因為理論上第一節點是不可編輯的,但是為了把功能做全,就讓第一選單也具有增刪改查的功能.所有把選單的節點深度(node.getDepth()>1)限制注消掉了.

選單上的四個不同的方法如下:

在方法中有幾個變數都需要用到,所有需要設定幾個全域性變數:

var rightClickTreeNode = null;//右鍵點選樹節點

//獲取最上層節點ID,即父類別ID,在資料庫中指EMERGENCYWORKFLOW表TYPE_ID欄位,該欄位與EMERGENCYTYPE表PK_ID欄位關聯,級聯刪除。

function getNodeTypeID(node)

{

if(node.getDepth() != 1)

{

return getNodeTypeID(node.parentNode);

}

return node.attributes.attributes.pk_id;

}

//新增節點選單函式

var addTreeNode = function(node)

{

rightClickTreeNode = node;

Ext.MessageBox.prompt('節點名稱', '請輸入新節點名稱:', addTreeNodeAjax);

};

//新增節點選單處理函式

function addTreeNodeAjax(btn,text)

{

if(btn == 'ok')

{

if(text.Trim() == '')

{

Ext.Msg.alert('友情提示','節點名稱不能為空!');

rightClickTreeNode = null;

return;

}

else

{

var typeId = getNodeTypeID(rightClickTreeNode);

text = encodeURI(text.Trim());

var depth=rightClickTreeNode.getDepth();

if(depth!='1')

{

treeloader.dataUrl ='tree.aspx?action=addTreeNode&pid='+rightClickTreeNode.parentNode.attributes.attributes.pk_id+'&depth='+rightClickTreeNode.getDepth()

+'&typeId='+typeId+'&newNode='+text;

}

else

{

treeloader.dataUrl =tree.aspx?action=addTreeNode&depth='+rightClickTreeNode.getDepth()+'&newNode='+text;

}

root.reload();

tree.expandAll();

rightClickTreeNode = null;

}

}

};

//新增子節點選單函式

var addChildTreeNode = function (node)

{

rightClickTreeNode = node;

Ext.MessageBox.prompt('友情提示', '請輸入子節點名稱:', addChildTreeNodeAjax);

};

//新增子節點選單處理函式

function addChildTreeNodeAjax(btn,text)

{

if(btn == 'ok')

{

if(text.Trim() == '')

{

Ext.Msg.alert('友情提示','子節點名稱不能為空!');

rightClickTreeNode = null;

return;

}

else

{

var depth=rightClickTreeNode.getDepth();

var typeId = getNodeTypeID(rightClickTreeNode);

text = encodeURI(text.Trim());

if(depth!='1')

{

treeloader.dataUrl ='tree.aspx?action=addChildTreeNode&id='+rightClickTreeNode.attributes.attributes.pk_id+'&typeId='+typeId+'&newNode='+text;

}

else

{

treeloader.dataUrl ='tree.aspx?action=addChildTreeNode&typeId='+typeId+'&newNode='+text;

}

root.reload();

tree.expandAll();

rightClickTreeNode = null;

}

}

};

//刪除樹節點函式

var deleteTreeNode = function(node)

{

rightClickTreeNode = node;

Ext.MessageBox.confirm('友情提示', '確定刪除節點嗎?(注意:此動作將同時刪除該節點下的所有子節點)',deleteChildTreeNodeAjax);

};

//刪除樹節點處理函式

function deleteChildTreeNodeAjax(btn)

{

if(btn == 'yes')

{

var depth=rightClickTreeNode.getDepth();

treeloader.dataUrl ='tree.aspx?action=deleteChildTreeNode&depth='+depth+'&id='+rightClickTreeNode.attributes.attributes.pk_id;

root.reload();

tree.expandAll();

rightClickTreeNode = null;

}

};

//重新命名樹節點函式

var renameTreeNode = function (node)

{

rightClickTreeNode = node;

Ext.MessageBox.prompt('友情提示', '請輸入新節點名稱:', renameTreeNodeAjax,this,false,node.text);

};

//重新命名樹節點處理函式

function renameTreeNodeAjax(btn,text)

{

if(btn == 'ok')

{

if(text.Trim() == '')

{

Ext.Msg.alert('友情提示','子節點名稱不能為空!');

rightClickTreeNode = null;

return;

}

else if(text.Trim() == rightClickTreeNode.text)

{

Ext.Msg.alert('友情提示','請輸入不同的名稱!');

rightClickTreeNode = null;

return;

}

else

{

text = encodeURI(text.Trim());

var depth=rightClickTreeNode.getDepth();

treeloader.dataUrl =tree.aspx?action=renameTreeNode&depth='+depth+'&id='+rightClickTreeNode.attributes.attributes.pk_id+'&newName='+text;

root.reload();

tree.expandAll();

rightClickTreeNode = null;

}

}

}

:

一個樹形選單一般不會單獨做一個頁面,一般都會放到一個別的容器裡(ViewPort);

先定義在ViewPort前面一個Panel:

var managePanel = new Ext.Panel({

title:'管理頁面',

height: 800,

width : 700,

layout:'absolute',

renderTo : 'Div',

tbar: new Ext.Toolbar({

enableOverflow: true,

disabled : true,

items: [

{

text: '新增節點',

icon : '../../Image/Workflow/ICO/Events.ico',

handler: createNode.createCallback(null)

},'-',{

text: '新增線條',

icon : '../../Image/Workflow/ICO/Events.ico',

menu: [{

text: '左箭頭',

handler: createLine.createCallback('左箭頭')

},{

text: '右箭頭',

handler: createLine.createCallback('右箭頭')

}]

},'-',{

text: '刪除選中項',

icon : '../../Image/Workflow/ICO/Events.ico',

handler: deleteItem.createCallback()

},'-',{

text: '面板大小',

icon : '../../Image/Workflow/ICO/Events.ico',

menu: [{

text: '設定高度',

handler: setHeight.createCallback()

},{

text: '設定寬度',

handler: setWidth.createCallback()

}]

}]

})

});

var viewport = new Ext.Viewport({

header : false,

layout:'border',

items:[{

region:'west',

id:'west-panel',

headerCfg :{align:'center',cls: 'x-panel-header'},

title:'應急預案流程',

split:true,

width: 200,

minSize: 175,

maxSize: 350,

collapsible: true,

autoScroll:true,

items: [{

header:false,

border:false,

items:[tree]

}]

},

{

region:'center',

id : 'center-panel',

//autoWidth:true,

autoScroll : true,

height:500,

width:500,

layout:'anchor',

items:[managePanel]// panel自己可以在前面初始定義一個.

}]

});

所有有方法都是向後臺傳送請求,然後後臺根據不同的action來執行不同的方法.一般都把方法歸總到一個類CS檔案(App_Code/tree.cs):

(1) 生成樹的方法如下:

//獲得總節點的所有資訊

public static string GetAllType()

{

string result = "";

try

{

string sql = "select * from emergencytype";

DataTable typeDT = dbHelpSql.Query(sql);

string pid = "";

TreeNode root = new TreeNode("根節點", "根節點");

TreeNode node = null;

foreach (DataRow row in typeDT.Rows)

{

pid = row["PK_ID"].ToString();

node = new TreeNode(row["TYPE"].ToString(), pid);

BuildWorkFlowChild(node);

root.ChildNodes.Add(node);

}

result = JsonHelper.GetJSTreeJSONData(root.ChildNodes);

}

catch (Exception ex)

{

result = "{" + JsonHelper.GetErrorJson(ex.Message) + "}";

}

return result;

}

//根據總節點獲得此節點下所有的子節點資訊

private static void BuildWorkFlowChild(TreeNode node)

{

try

{

string sql = string.Format("select * from emergencyworkflow where type_id = {0} order by pk_Id,parent_id", node.Value);

DataTable dt = dbHelpSql.Query(sql);

BuildNode(node, dt);

}

catch (Exception ex)

{

throw new Exception(ex.Message);

}

}

//建立父節點下所有子節點

private static void BuildNode(TreeNode node, DataTable source)

{

TreeNode tNode = null;

DataView dv = null;

DataTable tDt = null;

foreach (DataRow row in source.Rows)

{

if (row["PARENT_ID"].ToString() == "")

{

tNode = new TreeNode(row["NODE_DESC"].ToString(), row["PK_ID"].ToString());

dv = source.DefaultView;

dv.RowFilter = string.Format("parent_id = '{0}'", tNode.Value);

tDt = dv.ToTable();

if (tDt.Rows.Count > 0)

{

BuildChildNode(tNode, tDt, source);

}

node.ChildNodes.Add(tNode);

}

}

}

//若子節點下還有下一級,則遍歷迴圈

private static void BuildChildNode(TreeNode node, DataTable fDT, DataTable source)

{

TreeNode tNode = null;

DataView dv = null;

DataTable tDt = null;

foreach (DataRow row in fDT.Rows)

{

tNode = new TreeNode(row["NODE_DESC"].ToString(), row["PK_ID"].ToString());

dv = source.DefaultView;

dv.RowFilter = string.Format("parent_id = '{0}'", tNode.Value);

tDt = dv.ToTable();

if (tDt.Rows.Count > 0)

{

BuildChildNode(tNode, tDt, source);

}

node.ChildNodes.Add(tNode);

}

}

(2)增刪改查的方法:

1.增加同級樹的節點(根據深度來判斷)

// 新增樹節點

public static string AddTreeNode(string pid, string name, string depth, string typeId)

{

string result = "";

try

{

string sql;

if (depth == "1")

{

sql = string.Format("insert into emergencytype(pk_id, type)values(SEQ_EMERGENCYTYPE.NEXTVAL,'{0}')", name);

}

else if (depth == "2")

{

sql = string.Format("insert into emergencyworkflow values(SEQ_EMERGENCYWORKFLOW.Nextval,'{0}',null,{1},null)", name, typeId);

}

else

{

sql = string.Format("insert into emergencyworkflow values(SEQ_EMERGENCYWORKFLOW.Nextval,'{0}',{1},{2},null)", name, pid, typeId);

}

if (dbHelpSql.ExecuteSql(sql) == 1)

{

result = GetAllType();

}

}

catch (Exception ex)

{

result = "{" + JsonHelper.GetErrorJson(ex.Message) + "}";

}

return result;

}

2.增加樹的子節點

// 新增子節點

public static string AddChildTreeNode(string id, string name, string typeId)

{

string result = "";

try

{

string sql;

if (id == null || string.IsNullOrEmpty(id))

{

sql = string.Format("insert into emergencyworkflow values(SEQ_EMERGENCYWORKFLOW.Nextval,'{0}',null,{1},null)", name, typeId);

}

else

{

sql = string.Format("insert into emergencyworkflow values(SEQ_EMERGENCYWORKFLOW.Nextval,'{0}',{1},{2},null)", name, id, typeId);

}

if (dbHelpSql.ExecuteSql(sql) == 1)

{

result = GetAllType();

}

}

catch (Exception ex)

{

result = "{" + JsonHelper.GetErrorJson(ex.Message) + "}";

}

return result;

}

3.刪除樹的節點(同時刪除以此節點為父節點的節點)

// 刪除指定ID節點及其子節點

public static string DeleteTreeNode(string id, string depth)

{

string result = "";

OracleConnection con = null;

OracleTransaction trans = null;

OracleCommand cmd = null;

string sql;

try

{

con = dbHelpSql.GetOracleConnection();

con.Open();

trans = con.BeginTransaction();

cmd = con.CreateCommand();

cmd.Transaction = trans;

if (depth == "1")

{

sql = string.Format("delete emergencytype where pk_id = {0}", id);

cmd.CommandText = sql;

cmd.ExecuteNonQuery();

sql = string.Format("delete emergencyworkflow where type_id = {0} ", id);

cmd.CommandText = sql;

cmd.ExecuteNonQuery();

trans.Commit();

}

else

{

sql = string.Format("delete emergencyworkflow where pk_id = {0} or parent_id = {0} ", id);

cmd.CommandText = sql;

cmd.ExecuteNonQuery();

trans.Commit();

}

//if (dbHelpSql.ExecuteSql(sql) > 0)

//{

result = GetAllType();

//}

}

catch (Exception ex)

{

result = "{" + JsonHelper.GetErrorJson(ex.Message) + "}";

trans.Rollback();

}

finally

{

if (cmd != null)

{

cmd.Dispose();

}

if (trans != null)

{

trans.Dispose();

}

if (con != null)

{

con.Dispose();

}

}

return result;

}

4.重命子節點

// 重新命名指定id樹節點

public static string RenameTreeNode(string id, string newName, string depth)

{

string result = "";

try

{

string sql;

if (depth != "1")

{

sql = string.Format("update emergencyworkflow set node_desc = '{0}' where pk_id = {1} ", newName, id);

}

else

{

sql = string.Format("update emergencytype set type = '{0}' where pk_id = {1} ", newName, id);

}

if (dbHelpSql.ExecuteSql(sql) == 1)

{

result = GetAllType();

}

}

catch (Exception ex)

{

result = "{" + JsonHelper.GetErrorJson(ex.Message) + "}";

}

return result;

}

附錄: (JSON處理類[App_Code/JsonHelper.cs]中的方法)

/// <summary>

/// 將TreeNode陣列中的每一個節點及其全部子節點轉換為Json格式字串

/// </summary>

/// <param name="nodes"></param>

/// <returns></returns>

public static string GetJSTreeJSONData(TreeNodeCollection nodes)

{

StringBuilder treeString = new StringBuilder();

//構建JSON開頭

treeString.Append("[");

//foreach (TreeNode node in nodes)

for (int i = 0; i < nodes.Count;i++ )

{

//如果有子節點,則進行子節點構建

if (nodes[i].ChildNodes.Count != 0)

{

treeString.Append("{ attributes: {pk_id: '" + nodes[i].Value + "'}, text:'" + nodes[i].Text + "',expanded: false");

RecurrenceBuildJSTreeJSONData(treeString, nodes[i]);

}

else

{

treeString.Append("{ attributes: {pk_id: '" + nodes[i].Value + "'}, text:'" + nodes[i].Text + "',leaf: true");

}

//構建節點結尾

treeString.Append("}");

if(i != nodes.Count -1)

{

treeString.Append(",");

}

}

treeString.Append("]");

return treeString.ToString();

}

/// <summary>

/// 將單個節點及其所有子節點轉換為Json格式字串

/// </summary>

/// <param name="nodes"></param>

/// <returns></returns>

public static string GetJSTreeJSONData(TreeNode nodes)

{

StringBuilder treeString = new StringBuilder();

//構建JSON開頭

treeString.Append("[");

//構建節點

treeString.Append("{ attributes: {pk_id: '" + nodes.Value + "'}, text:'" + nodes.Text + "',expanded: false");

//如果有子節點,則進行子節點構建

if (nodes.ChildNodes.Count != 0)

{

RecurrenceBuildJSTreeJSONData(treeString, nodes);

}

//構建節點結尾

treeString.Append("}");

//構建JSON結尾

treeString.Append("]");

return treeString.ToString();

}

private static void RecurrenceBuildJSTreeJSONData(StringBuilder treeString, TreeNode nodes)

{

//構建子節點開頭

treeString.Append(",children: [");

for (int i = 0; i < nodes.ChildNodes.Count; i++)

{

treeString.Append("{ attributes: {pk_id: '" + nodes.ChildNodes[i].Value + "'},text:'" + nodes.ChildNodes[i].Text + "'");

if (nodes.ChildNodes[i].ChildNodes.Count != 0)

RecurrenceBuildJSTreeJSONData(treeString, nodes.ChildNodes[i]);

else

treeString.Append(",leaf:true");

//構建最後一條節點的結尾

if (i == nodes.ChildNodes.Count - 1)

treeString.Append("}");

//構建非最後一條節點的結尾

else

treeString.Append("},");

}

//構建子節點結尾

treeString.Append("]");

}

/// <summary>

/// 轉換異常資訊為同一的Json資料格式

/// </summary>

/// <param name="msg"></param>

/// <returns></returns>

public static string GetErrorJson(string msg)

{

if(msg.IndexOf("/n") > 0)

{

msg = msg.Substring(0, msg.IndexOf("/n"));

}

return "err:{msg:'" + msg + "'}";

}

/// <summary>

/// 將DataTable資料轉換為Json表格資料格式

/// </summary>

/// <param name="dt"></param>

/// <returns></returns>

public static string GetTableJson(DataTable dt)

{

//{success;true,data:{clientName: "Fred. Olsen Lines",portOfLoading:"FXT",portOfDischarge: "OSL"}}

string data = "data:[";

if (dt != null && dt.Rows.Count > 0)

{

foreach(DataRow row in dt.Rows)

{

data += "{";

foreach(DataColumn column in dt.Columns)

{

data += column.ColumnName + ":'" + row[column].ToString() + "',";

}

data = data.Substring(0, data.Length - 1);

data += "},";

}

data = data.Substring(0, data.Length - 1);

}

data += "]";

return data;

}

相關推薦

Ext 選單(刪改)

首先看資料庫的構造: 第一個是總的類別表(例表1[emergencytype]),此表中存放的是總的類別表,理論是不可編輯的,表中詳細資訊見表1-1. 第二個是總的分類別表下的小類別(例表2[emergencyworkflow]),所做的主要操作,是對錶2的增刪改查.表中詳

MySQL數據類/屬性/刪改(14)

類型 base table 存儲 使用 left 日期 null name MySQL數據類型 日期類型 ·date date數據類型負責存儲日期信息(1000-01-01到9999-12-31)可以使用數字和字符串插入(20180809或"2018-08-09")非數

Python的列表類操作——“刪改”,元組——“

增刪 mov 增刪改 常用 元組 for range 對象 嵌套 一、什麽是列表   1.列表是一個可變的數據類型,它由[]表示,其中的每一項元素使用“,”逗號隔開,可以儲存各種數據類型。列表相比於字符串,可以存放大量數據類型,其是有序的,有索引,可以使用切片,方便取值。

python-10:列表類操作:刪改

.com 分享圖片 圖片 類型 python n-1 info com 列表 python-10:列表類型操作:增刪改查

平衡二叉建立及其刪改(JAVA)

平衡二叉樹:指的是左右子樹高度差的絕對值不超過一的二叉排序樹。 主要思路:1、用左高度跟右高度代替平衡因子,大於1進行L~調整,小於-1進行R~調整                   2、每次插入都通過遞迴計算一次各結點高度,然後進行旋轉調整            

二叉排序 基礎操作 刪改

//本人比較懶,寫不寫註釋看心情 #include<iostream> #include<malloc.h> #include<cstdio> #include<cstdlib> using namespace std; ty

Java數據結構——二叉節點的刪改、獲取深度及最大最小值

brush java數據結構 public bool 方法 ret 樹節點 增刪改查 bject 一、查找最大值 // 查找最大值 public static Node maxNode() { Node node = root; Node maxNode =

ztree在SSSM中的刪改

gda app namespace upd 等於 ttr interface ise info ztree插件地址:http://www.treejs.cn/v3/main.php#_zTreeInfo 1、先下載插件引入到項目中: <%@ page language

Redis:五種數據類的簡單刪改

war value tro sts class 例子 list集合 ring one Redis簡單增刪改查例子 例一:字符串的增刪改查 #增加一個key為ay_key的值 127.0.0.1:6379> set ay_key "ay" OK #查詢ay_key的值

集合的刪改、集合類的關系測試

ans hone 信息 subset 數據 .com 不存在 intersect 刪除 集合類型 如何同時找出買了IPhone7和8的人? 集合的增刪改查

redis 5種數據類刪改

span list field diff nio 分享 col tar redis 1 # 字符串 string 2 (1)添加數據 3 set key value # 添加一條 4 mset key value [key value...] # 添加多條

Java實現二叉——刪改

今天心血來潮,突然想寫個二叉樹的類,哈哈~ 功能程式碼如下: package tree; /** * 傻逼tree * @author lwj * @date 2018/9/20 */ public class MyTree<K extends Co

可編輯Ztree的使用(包括對後臺資料庫的刪改

找了很多網上關於Ztree的例子和程式碼才搞定。 首先,關於Ztree的程式碼不介紹了,網上下載之後,引用下列四個檔案就能使用了。       1.關於配置選項。主要通過回撥函式來實現向後臺傳送資料,實現增刪改查。   1 var setti

Android : tablayout +側滑選單 + 豎立的tablayout +資料庫刪改+XListView+PullToRefresh 綜合

側拉選單 一個XListview載入,一個是PullToRefresh重新整理 一個是本地資料的重新整理一個是網路資料的重新整理 資料庫的增刪查 需要用到的許可權 <uses-permission android:name="android.permission.I

手把手教你ExtJS從入門到放棄——篇二十三(示例20:Ext.dom.Element類中常用刪改方法詳解)

方法多多,就講部分常用的 查詢系: onReady就不寫了,上核心程式碼 contains:引數可以傳id或者元素 、 child:返回該元素的子元素 down(選擇器):根據選擇器獲取該元素下層內層元素(常用) first:獲取第一個子元素

java--二叉刪改詳解

二叉樹的刪除和修改 二叉樹的刪除比較複雜。你要先找到要刪除的結點。要刪除的結點物件並不一定要刪除。因為通過函式呼叫得到的只是他的副本。並不會真正的把他刪掉。你只要讓他不在樹上就ok了。讓刪除結點的父節點,左右孩子結點用新的結點來指向就把該結點從樹上刪除了。

B刪改

B-樹,即為B樹。因為B樹的原英文名稱為B-tree,而國內很多人喜歡把B-tree譯作B-樹,B-tree就是指的B樹。 B-樹容易讓人誤解,建議大家用B樹稱呼, 本文以下直稱B樹 對概念不理解的可以參考 我的另一篇介紹B樹概念和應用的部落格:  https://blog.c

二叉時間複雜度分析及刪改操作java實現

順序表和連結串列的時間複雜度由給定條件不同從而會得出不同的時間複雜度結果,對於程式設計時並不總是最好用的儲存方式。二叉樹是一種更加穩定的資料儲存方式,其複雜度總是能表示為一個固定的形式。以下來分析二叉樹增刪改查操作做的時間複雜度。 設有如下資料需要進行二叉樹形式儲存:

二叉查詢刪改

#include <stdio.h> #include <string.h> #include <stdlib.h> #ifndef __Tree_H struct TreeNode; typedef struct Tre

jqery easyui 利用treeview實現選單刪改

$(function () { //function onEndEdit(index, row) { // debugger; // var ed = $(this).datagrid('getEditor', {