回到目录

上一讲中,我们学习了如何使用zTree对一棵大树(大数据量的树型结构的数据表,呵呵,名称有点绕,但说的是事实)进行异步加载,今天这讲,我们来说说,如何去操作这棵大树,无非就是添加子节点,删除节点,编辑节点,节点之间的拖拽,节点位置的变化(排序)等等。

事实上,jquery.ZTree的demo已经把前台JS代码给的很清晰了,我们只要稍加修改,然后把后台CS代码写好就可以了,我将demo的前台代码做了简单的处理,减化了些代码,项目架构使用microsoft mvc 3.0

前台HTML代码如下:

<link href="../../Scripts/JQuery-zTree/css/zTreeStyle/zTreeStyle.css" rel="stylesheet" />
<script src="../../Scripts/JQuery-zTree/js/jquery-1.4.4.min.js"></script>
<script src="../../Scripts/JQuery-zTree/js/jquery.ztree.all-3.5.min.js"></script>
<style type="text/css">
.ztree li span.button.add { margin-left: 2px; margin-right: -1px; background-position: -144px 0; vertical-align: top; *vertical-align: middle; }
a { text-decoration: underline; }
</style>
<script type="text/javascript">
/*
动态数据测试部分开始 */
var log, className = "dark";
var treeID = "treeDemo";
var curDragNodes, autoExpandNode;
var newCount = 1; //异步加载节点
var setting4 = {
data: {
simpleData: {
enable: true,
idKey: "id",
pIdKey: "pId",
rootPId: null
}
},
edit: {
enable: true,
editNameSelectAll: true,
showRemoveBtn: showRemoveBtn,
showRenameBtn: showRenameBtn,
removeTitle: "删除",
renameTitle: "编辑",
drag: {
autoExpandTrigger: true,
prev: dropPrev,
inner: dropInner,
next: dropNext
}
},
view: {
addHoverDom: addHoverDom,
removeHoverDom: removeHoverDom,
selectedMulti: false
},
async: {
//异步加载
enable: true,
url: "/ZTree/AsyncGetNodes",
autoParam: ["id", "name", "pId"]
},
callback: {
/*节点获取与展开回调*/
beforeExpand: beforeExpand,
onAsyncSuccess: onAsyncSuccess,
onAsyncError: onAsyncError,
/*编辑与删除回调*/
beforeEditName: beforeEditName,
beforeRemove: beforeRemove,
beforeRename: beforeRename,
onRemove: onRemove,
onRename: onRename,
/*拖动回调*/
beforeDrag: beforeDrag,
beforeDrop: beforeDrop,
beforeDragOpen: beforeDragOpen,
onDrag: onDrag,
onDrop: onDrop,
onExpand: onExpand
}
};
function beforeEditName(treeId, treeNode) {
className = (className === "dark" ? "" : "dark");
var zTree = $.fn.zTree.getZTreeObj(treeID);
zTree.selectNode(treeNode);
return confirm("进入节点 -- " + treeNode.name + " 的编辑状态吗?");
}
function beforeRemove(treeId, treeNode) {
className = (className === "dark" ? "" : "dark");
var zTree = $.fn.zTree.getZTreeObj(treeID);
zTree.selectNode(treeNode);
return confirm("确认删除 节点 -- " + treeNode.name + " 吗?");
}
function beforeRename(treeId, treeNode, newName, isCancel) {
className = (className === "dark" ? "" : "dark");
if (newName.length == 0) {
alert("节点名称不能为空.");
var zTree = $.fn.zTree.getZTreeObj(treeID);
setTimeout(function () { zTree.editName(treeNode) }, 10);
return false;
}
return true;
}
function onRemove(e, treeId, treeNode) {
$.ajax({
url: '/ZTree/AsyncDelNodes', //url action是方法的名称
data: { id: treeNode.id },
type: 'POST',
success: function (data) {
alert(data);
}
}); }
function onRename(e, treeId, treeNode, isCancel) {
alert("编辑了节点" + treeNode.id + " " + treeNode.name);
$.ajax({
url: '/ZTree/AsyncEditNodes', //url action是方法的名称
data: { id: treeNode.id, name: treeNode.name },
type: 'POST',
success: function (data) {
alert(data);
}
}); }
function showRemoveBtn(treeId, treeNode) {
//return !treeNode.isFirstNode;
return true;
}
function showRenameBtn(treeId, treeNode) {
// return treeNode.isLastNode;
return true;
}
function addHoverDom(treeId, treeNode) {
var sObj = $("#" + treeNode.tId + "_span");
if (treeNode.editNameFlag || $("#addBtn_" + treeNode.tId).length > 0) return;
var addStr = "<span class='button add' id='addBtn_" + treeNode.tId
+ "' title='add node' onfocus='this.blur();'></span>";
sObj.after(addStr);
var btn = $("#addBtn_" + treeNode.tId);
if (btn) btn.bind("click", function () {
var zTree = $.fn.zTree.getZTreeObj(treeID);
zTree.addNodes(treeNode, {
id: (100 + newCount), pId: treeNode.id, name: "new node" + newCount
});
$.ajax({
url: '/ZTree/AsyncAddNodes', //url action是方法的名称
data: { id: (100 + newCount), pid: treeNode.id, name: "new node" + newCount },
type: 'POST',
success: function (data) {
//异常完成后,刷新父节点及下面所有子节点
zTree.reAsyncChildNodes(treeNode, "refresh");
}
});
newCount++;
return false;
});
};
function removeHoverDom(treeId, treeNode) {
$("#addBtn_" + treeNode.tId).unbind().remove();
};
function createTree() {
$.ajax({
url: '/ZTree/AsyncGetNodes', //url action是方法的名称
data: { id: 0 },
type: 'Get',
dataType: "text", //可以是text,如果用text,返回的结果为字符串;如果需要json格式的,可是设置为json
success: function (data) {
$.fn.zTree.init($("#" + treeID), setting4, eval('(' + data + ')'));
},
error: function (msg) {
alert(" 数据加载失败!" + msg);
}
});
}
function beforeExpand(treeId, treeNode) {
if (!treeNode.isAjaxing) {
return true;
} else {
alert("zTree 正在下载数据中,请稍后展开节点。。。");
return false;
}
}
function onAsyncSuccess(event, treeId, treeNode, msg) { }
function onAsyncError() {
alert(" 数据加载失败");
}
$(document).ready(function () {
createTree();
}); function dropPrev(treeId, nodes, targetNode) { var pNode = targetNode.getParentNode();
if (pNode && pNode.dropInner === false) {
return false;
} else {
for (var i = 0, l = curDragNodes.length; i < l; i++) {
var curPNode = curDragNodes[i].getParentNode();
if (curPNode && curPNode !== targetNode.getParentNode() && curPNode.childOuter === false) {
return false;
}
}
}
return true;
}
function dropInner(treeId, nodes, targetNode) { if (targetNode && targetNode.dropInner === false) {
return false;
} else {
for (var i = 0, l = curDragNodes.length; i < l; i++) {
if (!targetNode && curDragNodes[i].dropRoot === false) {
return false;
} else if (curDragNodes[i].parentTId && curDragNodes[i].getParentNode() !== targetNode && curDragNodes[i].getParentNode().childOuter === false) {
return false;
}
}
}
return true;
}
function dropNext(treeId, nodes, targetNode) { var pNode = targetNode.getParentNode();
if (pNode && pNode.dropInner === false) {
return false;
} else {
for (var i = 0, l = curDragNodes.length; i < l; i++) {
var curPNode = curDragNodes[i].getParentNode();
if (curPNode && curPNode !== targetNode.getParentNode() && curPNode.childOuter === false) {
return false;
}
}
}
return true;
}
function beforeDrag(treeId, treeNodes) {
className = (className === "dark" ? "" : "dark");
for (var i = 0, l = treeNodes.length; i < l; i++) {
if (treeNodes[i].drag === false) {
curDragNodes = null;
return false;
} else if (treeNodes[i].parentTId && treeNodes[i].getParentNode().childDrag === false) {
curDragNodes = null;
return false;
}
}
curDragNodes = treeNodes;
return true;
}
function beforeDragOpen(treeId, treeNode) {
autoExpandNode = treeNode;
return true;
}
function beforeDrop(treeId, treeNodes, targetNode, moveType, isCopy) {
className = (className === "dark" ? "" : "dark");
return true;
}
function onDrag(event, treeId, treeNodes) {
className = (className === "dark" ? "" : "dark");
}
function onDrop(event, treeId, treeNodes, targetNode, moveType, isCopy) {
className = (className === "dark" ? "" : "dark");
$.ajax({
url: '/ZTree/AsyncDragNodes', // url action是方法的名称
data: { id: treeNodes[0].id, pid: targetNode.id, name: treeNodes[0].name, moveType: moveType, isCopy: isCopy },
type: 'POST',
success: function (data) {
}
}); }
function onExpand(event, treeId, treeNode) {
if (treeNode === autoExpandNode) {
className = (className === "dark" ? "" : "dark");
}
}
</script> <div class="zTreeDemoBackground left">
<ul id="treeDemo" class="ztree"></ul>
</div>

面各种JS事件,所对应的MVC代码如下:

#region 对节点的操作
/// <summary>
/// 得到一级子节点
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public string AsyncGetNodes(int? id)
{
var model = irepository.GetEntities()
.Where(i => i.ParentID == id).OrderBy(i => i.Sortable); return model.ToJson();
}
/// <summary>
/// 添加节点
/// </summary>
/// <param name="id"></param>
/// <param name="name"></param>
/// <param name="pid"></param>
/// <returns></returns>
public string AsyncAddNodes(int id, string name, int pid)
{
try
{
//得到父对象,但设置它的isParent属性
irepository.Modify(i => new Category
{
ID = pid,
IsParent = true,
}); var entity = new Category
{
Name = name,
ParentID = pid,
CreateDate = DateTime.Now,
Level = ,
IsParent = false,
};
irepository.Add(entity); return entity.ID.ToString();
}
catch (Exception ex)
{ return ex.Message;
} }
/// <summary>
/// 编辑节点(重命名)
/// </summary>
/// <param name="id"></param>
/// <param name="name"></param>
/// <returns></returns>
public string AsyncEditNodes(int id, string name)
{
try
{
irepository.Modify(i => new Category
{
ID = id,
Name = name,
});
return "操作成功";
}
catch (Exception ex)
{ return ex.Message;
}
}
/// <summary>
/// 删除节点
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public string AsyncDelNodes(int id)
{
try
{
irepository.Remove(irepository.GetEntity(i => i.ID == id));
return "操作成功";
}
catch (Exception ex)
{
return ex.Message;
}
}
/// <summary>
/// 拖拽节点
/// </summary>
/// <param name="id"></param>
/// <param name="pid"></param>
/// <param name="sortable"></param>
/// <returns></returns>
public string AsyncDragNodes(
int id,
int pid,
string name,
string moveType,
bool isCopy)
{
try
{
var parent = irepository.GetEntity(i => i.ID == pid);
var parentSons = irepository.GetEntities(i => i.ParentID == pid);
var current = irepository.GetEntity(i => i.ID == id);
if (moveType == "inner")
parent.isParent = true;
else if (parentSons == null || parentSons.Count() == )
parent.isParent = false;
if (isCopy)//复制,前台目前不能实现
{
irepository.Add(new Category
{
ParentID = pid,
Name = name,
CreateDate = DateTime.Now,
});
}
else
{
if (moveType == "inner")
{
current.ParentID = pid;
irepository.Modify(current);
}
else
{
current.ParentID = parent.ParentID;//同级移动时,与目标节点父ID相同
current.Sortable = moveType == "next"
? parent.Sortable +
: parent.Sortable - ;
irepository.Modify(current);
}
}
irepository.Modify(parent);
return "操作成功";
}
catch (Exception ex)
{ return ex.Message;
}
}
#endregion

好了,上面的代码只是对树结果做的最基本的操作,其中拖拽时的复制操作(按着ctrl键,拖拽节点),后台没有进行实现。

回到目录

爱上MVC3~MVC+ZTree实现对树的CURD及拖拽操作的更多相关文章

  1. MVC小系列(十五)【MVC+ZTree实现对树的CURD及拖拽操作】

    根据上一讲的可以加载一棵大树,这讲讲下如果操作这颗大树 <link href="../../Scripts/JQuery-zTree/css/zTreeStyle/zTreeStyle ...

  2. MVC+ZTree实现对树的CURD及拖拽操作

    上一讲中,我们学习了如何使用zTree对一棵大树(大数据量的树型结构的数据表,呵呵,名称有点绕,但说的是事实)进行异步加载,今天这讲,我们来说说,如何去操作这棵大树,无非就是添加子节点,删除节点,编辑 ...

  3. 爱上MVC3~MVC+ZTree大数据异步树加载

    回到目录 理论部分: MVC+ZTree:指在.net MVC环境下进行开发,ZTree是一个jquery的树插件 大数据:一般我们系统中,有一些表结构属于树型的,如分类,地域,菜单,网站导航等等,而 ...

  4. 【原创】MVC+ZTree实现权限树的功能

    今天自己采用MVC+ZTree的技术实现权限树的功能,有需要的可以收藏一下. 1.需要引用的JS 文件 <link href="~/Content/ZTree/css/demo.css ...

  5. ztree插件的使用及列表项拖拽的实现(jQuery)+异步加载节点数据

    为了实现如图所示的树状结构图,并使列表项可拖动到盒子里,研究了ztree这个插件的使用,并仔细研究了列表项的拖动事件.完成了预期需求,对jQuery的运用得到了提高.这个插件的功能非常强大,除了基本的 ...

  6. .net mvc mssql easyui treegrid 及时 编辑 ,支持拖拽

    这里提到了,1个问题,怎么扩展 Easyui 参见: http://blog.csdn.net/chenkai6529/article/details/17528833 @{ ViewBag.Titl ...

  7. 文件夹管理工具(MVC+zTree+layer)

    文件夹管理工具(MVC+zTree+layer)(附源码)   写在前 之前写了一篇关于 文件夹与文件的操作的文章  操作文件方法简单总结(File,Directory,StreamReader,St ...

  8. 文件夹管理工具(MVC+zTree+layer)(附源码)

    写在前 之前写了一篇关于 文件夹与文件的操作的文章  操作文件方法简单总结(File,Directory,StreamReader,StreamWrite )  把常用的对于文件与文件夹的操作总结了一 ...

  9. 使用zTree插件实现可拖拽的树

    在目前接触到的树插件中,我觉得zTree比较简单,也容易上手.有一次业务需求是将某对象分组树上的对象可以随意拖拽,相当于改变了对象的分组,因此我用到了zTree,对其进行了一些列学习.         ...

随机推荐

  1. hdoj 1272 小希的迷宫

    上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该是双向连通的,就是说如果有一个通道连通了 ...

  2. QQ浏览器安卓5.8版本的Uint8Array API有bug

    调用new Uint8Array()时QQ浏览器将直接返回参数列表, 比如new Uint8Array(a)将返回[a],比如new Uint8Array(a, b)将返回[a, b],比如new U ...

  3. GridView基础知识

    首先,gridview是封装好的,直接在设计界面使用,基本不需要写代码: 1.绑定数据源 GridView最好与LinQDatasourse配合使用,相匹配绑定数据: 2.外观控制 整体控制 自动选择 ...

  4. ElasticSearch学习-centos下安装

    1.安装java运行环境(jre) //这里我安装了jdk 其实只需要安装jre就可以了 0)cd /usr;mkdir /usr/java; cd java 1)wget http://downlo ...

  5. 计算机网路之动态NAT配置

    配置路由端口的ip地址与打开(省略) 配置路由协议 router eigrp 100 network 211.1.1.0(网络号) 0.0.0.255(通配子掩) network 192.168.1. ...

  6. Java学习笔记 06 数字格式化及数学运算

    一.数字格式化 DecimalFormat类 >>DecimalFormat是NumberFormat的子类,用于格式化十进制数,可以将一些数字格式化为整数.浮点数.百分数等.通过使用该类 ...

  7. SpringMVC常用注解實例詳解1:@Controller,@RequestMapping,@RequestParam,@PathVariable

    我的開發環境 框架:        springmvc+spring+freemarker 開發工具: springsource-tool-suite-2.9.0 JDK版本: 1.6.0_29 to ...

  8. ERDAS文件格式:IGE、IMG、RRD、AUX

    ERDAS如果需要打开大于2GB的文件,ERDAS需要把文件转换成IMG格式.这时候,ERDAS自动生成三个文件,分别是IMG.IGE和RRD文件,其中:1.IGE:是数据文件,实际用来存储栅格数据: ...

  9. GERBER文件

    GERBER文件 GERBER文件是一种国际标准的光绘格式文件,它包含RS-274-D和RS-274-X两种格式,其中RS-274-D称为基本GERBER格式,并 要同时附带D码文件才能完整描述一张图 ...

  10. oracle根据视图删除表

    delete from t_fwaqjcjl where zcbm in (select zcbm from view_fwaqjcjl where 1=1 )