最近在搞一个项目的维护,有一个问题是把原来的树导航变成多级的,原来的那个导航是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. java推断字符串是否为乱码

    项目中有一个功能 在IE中GET方式提交会产生乱码 但有两个入口都会走这同一段代码 固不能直接转码,所以要进行推断传过来的该值是不是乱码 可用下面方式验证: java.nio.charset.Char ...

  2. VBScript

    VBScript then PrintWMIErrorthenExit Err.Description, Err.Number else ifnot boolCathiMode then wscrip ...

  3. linux文件 编辑常用 inux手把手vi ---针对文件操作

    命令语法 说明 使用频率(1:常用;2一般:3:偶尔) 1.VI编辑器的启动与退出 VI编辑器的启动与退出 vi  file1 新建一个文本文件名为file1 :q 退出,如果对缓存去进行过修改,则提 ...

  4. posix thread API列表

    互斥量: pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;int pthread_mutex_init(pthread_mutex_t *mutex ...

  5. C#如何加载程序运行目录外的程序集

    我们的应用程序部署的时候,目录结构一般不会只有运行程序的目录这一个,我们可能在运行目录下建子目录,也可能使用System32目录,也可能使用其它第三方的程序集..Net程序集 首先会在GAC中搜索相应 ...

  6. Gvim使用心得--设置篇[转]

    1.设置自己喜欢的字体? 点“编辑”--“选择字体”, 然后在字体列表中选择一个你喜欢的字体和字号,然后确认. 如果想每次都使用这个这个字体 需要加到启动文件中 比如我的 set guifont=Co ...

  7. MYSQL之性能优化 ----MySQL性能优化必备25条

    今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数 ...

  8. nvl()函数

    Oracle里面的nvl()函数 Nvl(字段名,0):如果你某个字段为空,但是你想让这个字段显示0,nvl(字段名,0) ,就是当你选择出来的时候,这个字段虽然为空,但是显示的是0,当然这个0也可以 ...

  9. c# winform动态生成控件与获取动态控件输入的值

    差不多有2年没有写winform程序,一直都是写bs.最近项目需要,又开始着手写一个小功能的winform程序,需要动态获取xml文件的节点个数,生成跟节点个数一样的textbox, 最后还要获取操作 ...

  10. 编写delegate(明天补充)

    delegate基本上是一种callback机制,让别的类在