最近在搞一个项目的维护,有一个问题是把原来的树导航变成多级的,原来的那个导航是JsTree的,但我又不熟悉,遂头疼了好久。。。

终于,他还是出来了,下面就贴上主要代码和思路,因为我在搞这个东西的时候在园子里和网上没有找到适合的代码,或许我写的正好是你要找的呢也不一定啊。。。

1.此处是前台的代码:

<script type="text/javascript">
$(function () {
var id;
if ("$!id" != "") {
id = "$!id";
}
$("#MuLuHtml").tree({
data: {
async: false,
cache: false,
opts: {
url: "GetTree4Ajax.aspx?$!{dateTime.Now.toString('yyyyMMddHHmmssffff')}"
}
},
lang: { loading: '目录加载中...' },
selected: [id],
opened: ["muluRoot"],
ui: {
theme_name: "classic"
},
types: {
"Root": {
draggable: false,
deletable: false,
renameable: false,
icon: {
image: "/Theme/1/base/images/pi_diagona_pack.png"
}
},
"R1": {
draggable: false,
deletable: false,
renameable: false,
icon: {
image: "/Theme/1/base/images/pi_diagona_pack.png"
}
},
"R2": {
draggable: false,
deletable: false,
renameable: false,
icon: {
image: "/Theme/1/base/images/pi_diagona_pack.png"
}
},
"R3": {
draggable: false,
deletable: false,
renameable: false,
icon: {
image: "/Theme/1/base/images/pi_diagona_pack.png"
}
},
"R4": {
draggable: false,
deletable: false,
renameable: false,
icon: {
image: "/Theme/1/base/images/pi_diagona_pack.png"
}
}
},
callback: {
beforedata: function (NODE, TREE_OBJ) {
return {
id: $(NODE).attr("id") || 0,
JiBie: $(NODE).attr("JiBie") || -1,
ShangJiMuLuID: $(NODE).attr("zhujian") || 0,
Rel: $(NODE).attr("rel") || 0
}
},
oncreate: function (NODE, REF_NODE, TYPE, TREE_OBJ, RB) {
},
onrename: function (NODE, TREE_OBJ, RB) {
},
beforemove: function (NODE, REF_NODE, TYPE, TREE_OBJ) {
},
onmove: function (NODE, REF_NODE, TYPE, TREE_OBJ, RB) {
},
oncopy: function (NODE, REF_NODE, TYPE, TREE_OBJ, RB) {
},
beforedelete: function (NODE, TREE_OBJ) {
},
onselect: function (NODE, TREE_OBJ) {
var markName = $(NODE).attr("mark");
if (markName == "xiezuozu")//当节点是协作组的时候才在右边显示该协作组的列表
{
$("[name=contentFrame]").attr("src", "/System/GroupMem/List.aspx?ID=" + $(NODE).attr("zhujian") + "&rel=" + $(NODE).attr("rel"));
}
},
plugins: {},
onopen: function (NODE, tree_obj) {
var result = jQuery.ajax({
url: "GetChildTree.aspx?_=" + new Date().getTime(),
cache: false,
type: 'POST',
async: false,
data: { "higher_level": $(NODE).attr("zhujian"), "mark": $(NODE).attr("mark") },
dataType: "json",
sucess: function (data) {
return data;
}
});
var markName = $(NODE).attr("mark");
if (markName=="danwei") {
if (result.responseText != "" && $(NODE).find("ul").length == 1) {
$(NODE).append(result.responseText);
}
}
else {
if (result.responseText != "" && $(NODE).find("ul").length == 0) {
$(NODE).append(result.responseText);
}
}
}
}
});
document.oncontextmenu = new Function('event.returnValue=false;');
});
</script>

  2.后台的:

        public void GetTree4Ajax(int jiBie, int shangJiMuLuID, string rel, int flag)
{
CancelView();
try
{
string code = GlobalInfo.DepID;
string HightestUnitName = UnitInforHelper.GetUnitName(GlobalInfo.HighestUnitCode);
string strWhere = "";
if (code.Length == && code.Substring(, ) == "")
{
//省
strWhere = string.Format(" code like '{0}%'", code.Substring(, ));
}
else if (code.Length == && code.Substring(, ) == "")
{
//市
strWhere = string.Format(" code like '{0}%'", code.Substring(, ));
}
else if (code.Length == )
{
//区县
strWhere = string.Format(" code like '{0}%'", code);
}
else
{
//学校
strWhere = string.Format(" code = '{0}'", code);
}
StringBuilder sbMuLu = new StringBuilder("");
DataTable dt = HQLHelper.ExecuteDataTable(@"select * from dbo.view_unitInfor where " + strWhere+" order by name"); //查询单位(学校)
sbMuLu.Append("<ul>");
sbMuLu.Append("<li rel=\"Root\" id=\"" + code + "\" zhujian=\"all\" class=\"open\" mark=\"root\"><a href=\"#\"><ins>&nbsp;</ins>" + UnitInforHelper.GetUnitName(GlobalInfo.HighestUnitCode) + "</a>");
sbMuLu.Append("<ul>");
foreach (DataRow dr in dt.Rows)//学校单位
{
sbMuLu.Append("<li rel=\"R1\" id=\"" + dr["code"] + "\" zhujian=\"" + dr["code"] + "\" MingCheng=\"" + dr["name"] + "\" mark=\"danwei\"><a href=\"#\"><ins>&nbsp;</ins>" + dr["name"] + "</a>");
sbMuLu.Append("<ul>");
sbMuLu.Append("</ul></li>");
}
sbMuLu.Append("</ul>");
sbMuLu.Append("</li></ul>");
Session["sbMulu"] = sbMuLu.ToString();
Response.Write(sbMuLu.ToString());
}
catch (Exception ex)
{
LogHelper.WriteLogError(ex);
}
}
#region Added by DYK 2014-5-30
public void GetChildTree(string higher_level, string mark)
{
CancelView(); string Str = "";
try
{
DataTable dt = new DataTable();//学段表 if (mark == "root")//点击根展开单位
{
//
}
if (mark == "danwei")//点击单位展开学段
{
dt = GetChildTreeData(higher_level, mark);
Str = Open(dt, mark);
}
if (mark == "xueduan")//点击学段展开学科
{
dt = GetChildTreeData(higher_level, mark);
Session["c_p_id"] = higher_level;
Str = Open(dt, mark);
}
if (mark == "xueke")//点击学科加载年级
{
dt = GetChildTreeData(higher_level, mark);
Session["s_id"] = higher_level;
Str = Open(dt, mark);
}
if (mark == "nianji")//点击年级加载对应协作组
{
Session["g_id"] = higher_level;
dt = GetCoopGroupData(Session["g_id"].ToString(), Session["s_id"].ToString(), Session["c_p_id"].ToString());
Str = Closed(dt, "xiezuozu");//末级不能展开
}
Response.Write(Str);
}
catch (Exception ex)
{
LogHelper.WriteLogError(ex);
Response.Write("");
}
}
/// <summary>
/// 获取各个制定层级下面的协作组
/// </summary>
/// <param name="g_id"></param>
/// <param name="s_id"></param>
/// <param name="c_p_id"></param>
/// <returns></returns>
public DataTable GetCoopGroupData(string g_id, string s_id, string c_p_id)
{
CancelView();
DataTable dt = new DataTable();
try
{
//string cmdText = @"select groupid as code,groupname as name from dbo.base_cooperativeGroup where g_id ='" + g_id + "'and subjectId='" + s_id + "' and p_id='" + c_p_id + "'";
string cmdText = @"select groupid as code,groupname as name from dbo.base_cooperativeGroup where g_id ='" + g_id + "' and subjectId='" + s_id + "' and p_id=" + c_p_id;
dt = HQLHelper.ExecuteDataTable(cmdText);
}
catch (Exception)
{ throw;
}
return dt;
}
/// <summary>
/// 根据存储过程调用获取树的下一级(最后一级协作组除外)
/// </summary>
/// <param name="code"></param>
/// <param name="mark"></param>
/// <returns></returns>
public DataTable GetChildTreeData(string code, string mark)
{
CancelView();
DataTable dt = new DataTable();
try
{
SqlParameter[] ps = new SqlParameter[] {
new SqlParameter("@code",code),
new SqlParameter("@mark",mark)
};
dt = HQLHelper.ExecuteDataSet(CommandType.StoredProcedure, "GetChildTree", ps).Tables[];
}
catch (Exception)
{ throw;
}
return dt;
}
        public string Open(DataTable dt, string mark)
{
string this_mark = "";
if (mark == "danwei")
{
this_mark = "xueduan";
}
if (mark == "xueduan")
{
this_mark = "xueke";
}
if (mark == "xueke")
{
this_mark = "nianji";
}
if (mark == "nianji")
{
this_mark = "xiezuozu";
}
StringBuilder SuperTreeML = new StringBuilder("");
if (dt.Rows.Count > )
{
SuperTreeML.Append("<ul>");
foreach (DataRow dr in dt.Rows)
{
SuperTreeML.Append("<li rel=\"R1\" id=\"" + dr["code"] + "\" zhujian=\"" + dr["code"] + "\" MingCheng=\"" + dr["name"] + "\" title=\"" + dr["name"] + "\" mark=\"" + this_mark + "\" class=\"closed\"><a href=\"javascript:void(0);\"><ins>&nbsp;</ins>" + dr["name"] + "</a></li>");
}
SuperTreeML.Append("</ul>");
} else
{
SuperTreeML.Append("");
}
return SuperTreeML.ToString();
}
/// <summary>
/// 功能:末级不能展开
/// </summary>
/// <param name="dt"></param>
/// <param name="mark"></param>
/// <returns></returns>
public string Closed(DataTable dt, string mark)
{
StringBuilder SuperTreeML = new StringBuilder("");
if (dt.Rows.Count > )
{
SuperTreeML.Append("<ul>");
foreach (DataRow dr in dt.Rows)
{
SuperTreeML.Append("<li rel=\"Root\" id=\"" + dr["code"] + "\" zhujian=\"" + dr["code"] + "\" MingCheng=\"" + dr["name"] + "\" title=\"" + dr["name"] + "\" mark=\"" + mark + "\" class=\"leaf\"><a href=\"javascript:void(0);\"><ins>&nbsp;</ins>" + dr["name"] + "</a></li>");
}
SuperTreeML.Append("</ul>");
}
else
{
SuperTreeML.Append("");
}
return SuperTreeML.ToString();
}

 

3.设计到一个存储过程,就是根据两个参数@code,@mark来执行相应的sql了,这里就不贴了。

4.最后附上效果图:

ok,大功告成,没白费我着急上火的。

JsTree异步加载数据实现多级菜单的更多相关文章

  1. winform异步加载数据到界面

    做一个学习记录. 有两个需求: 1.点击按钮,异步加载数据,不卡顿UI. 2.把获取的数据加载到gridview上面. 对于需求1,2,代码如下: public delegate void ShowD ...

  2. 向上滚动或者向下滚动分页异步加载数据(Ajax + lazyload)[上拉加载组件]

    /**** desc : 分页异步获取列表数据,页面向上滚动时候加载前面页码,向下滚动时加载后面页码 ajaxdata_url ajax异步的URL 如data.php page_val_name a ...

  3. 淘宝购物车页面 智能搜索框Ajax异步加载数据

    如果有朋友对本篇文章的一些知识点不了解的话,可以先阅读此篇文章.在这篇文章中,我大概介绍了一下构建淘宝购物车页面需要的基础知识. 这篇文章主要探讨的是智能搜索框Ajax异步加载数据.jQuery的社区 ...

  4. Jquery zTree结合Asp.net实现异步加载数据

    zTree结合Asp.net实现异步加载数据 实现简单操作 zTree 下载 api 访问 :http://www.ztree.me/v3/main.php 例子中用到json数据转化 newtons ...

  5. jquery easyui easyui-treegrid 使用异步加载数据

    jquery easyui easyui-treegrid 使用异步加载数据 jquery easyui easyui-treegrid 异步请求 >>>>>>&g ...

  6. Highcharts 异步加载数据曲线图表

    导入 data.js 文件 异步加载数据需要引入以下js 文件: <script src="http://code.highcharts.com/modules/data.js&quo ...

  7. [Ext.Net]TreePanel 异步加载数据

    异步加载数据指的是页面加载的时候只显示根目录,点击根目录再去加载其子目录. 下面就来介绍下这种异步加载的树结构要怎么实现 现将例子的图 QQ图片20131225134353.jpg (12.1 KB, ...

  8. 新手教程:不写JS,在MIP页中实现异步加载数据

    从需求谈起:在 MIP 页中异步加载数据 MIP(移动网页加速器) 的 加速原理 除了靠谱的 MIP-Cache CDN 加速外,最值得一提的就是组件系统.所有 JS 交互都需要使用 MIP 组件实现 ...

  9. iScroll.js 向上滑动异步加载数据回弹问题

    iScroll是一款用于移动设备web开发的一款插件.像缩放.下拉刷新.滑动切换等移动应用上常见的一些效果都可以轻松实现. 现在最新版本是5.X,官网这里:http://iscrolljs.com/ ...

随机推荐

  1. [Python]linux自己定义Python脚本命令

    在window下写好的程序配置到Linux上,要实现随意文件夹下的命令调用. 因为初学Linux,这里从文件传输等最主要的方法入手,记录配置的过程中遇到的各种问题. 连接远端server 这里使用pu ...

  2. iOS开发--混编篇&swift与OC混合使用

    Swift与OC混合使用 swift 语言出来后,可能新的项目直接使用swift来开发,但可能在过程中会遇到一些情况,某些已用OC写好的类或封装好的模块,不想再在swift 中再写一次,哪就使用混编. ...

  3. 如何选择一个 Linux Tracer (2015)

    http://www.oschina.net/translate/choosing-a-linux-tracer

  4. 初学Node.js第一天

    最近开始下班到家不知道该做啥,因为水平太菜,要学的东西实在太多,反而陷入了不知道该学什么的困境,结果天天就是看别人的博客,看到什么标题比较感兴趣就点进去,没有一个目标. 今天突然兴起,决定要捣鼓捣鼓N ...

  5. [原创] 对于深度学习(deep learning)在工业界的应用现状和突破 [by matthewbai]

    现状: 1. 目前大家对于大部分需求,通常采用multiple layer,units in each layer也是人工订好的(虽然可以做稀疏,但是在same layer范围内竞争). 2. 网络结 ...

  6. php笔记01:php基本语法格式

    1. <?php ....... ?> 2. <script laugnage="php"> ....... </script> 3. < ...

  7. ASP.NET 相同页面前后端之间传值

    aspx页面前后端之间传值:前端的html或js获得后端的cs,后端的cs获得前端的js值. 一.前端获得后端的值 1.html元素 前端: <td><%=str%></ ...

  8. HTML5表单内元素的required属性

    当表单内元素(如input.textarea)中有required属性并且值不为false的时候,则该字段不能为空,否则提交失败. <input type="text" au ...

  9. Spring中Bean的生命中期与InitializingBean和DisposableBean接口

    Spring提供了一些标志接口,用来改变BeanFactory中的bean的行为.它们包括InitializingBean和DisposableBean.实现这些接口将会导致BeanFactory调用 ...

  10. Android_ProgressBar

    xml文件: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns ...