ComboTree

Asp.net下拉树实现(Easy UI ComboTree)

场景描述:某个公司有多个部门并且部门存在子部门,通过一个下拉框选取多个部门,但是如果某个部门的子部门被全部选择,则只取该部门,而忽略子部门。(叶子节点全被选中时,只取父节点)

知识点:ComboTree、一般处理程序、递归、Json

效果如图

数据库表设计:unit_main


unit_id


unit_name


parent_id


desc


部门ID


部门名称


父ID


说明

节点类设计:

 1 public class Unit
 2 {
 3         public decimal id { get; set; }
 4         public string text { get; set; }
 5         public string state { get; set; }
 6         public List<Unit> children { get; set; }
 7         public Unit ()
 8         {
 9             this.children = new List<Unit>();
10             this.state = "open";
11         }
12 }

处理类设计:

public class UnitComponent
 {
        ExeceteOralceSqlHelper SqlHelper= new ExeceteOralceSqlHelper();//数据库处理类
        public UnitParent GetUnit()
        {
            Unit rootUnit = new Unit();
            rootUnit.id = 1000;
            rootUnit.text = "BO API";
            rootUnit.children = GetUnitList(0);
            UnitRecursive(rootUnit.children);
            return rootUnit;
        }

        /// <summary>
        /// 递归查询部门
        /// </summary>
        /// <param name="units"></param>
        private void UnitRecursive(List<Unit> units)
        {
            foreach (var item in units)
            {
                item.children = GetUnitList(item.id);
                if (item.children != null && item.children.Count > 0)
                {
                    item.state = "closed";
                    UnitRecursive(item.children);
                }
            }
        }

        /// <summary>
        /// 通过parentID获取所有子部门
        /// </summary>
        /// <param name="parentID">父id</param>
        /// <returns>返回Unit集合</returns>
        private List<Unit> GetUnitList(decimal parentID)
        {
            List<Unit> unitLst = new List<Unit>();
            string sql = string.Format("select hh.unit_id,hh.unit_name from unit_main hh where hh.parent_id={0}", parentID);
            DataTable dt = SqlHelper.ExecuteDataTable(sql);//返回DataTable方法
            if (dt != null && dt.Rows.Count > 0)
            {
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    Unit dtup = new Unit()
                    {
                        id = Convert.ToInt32(dt.Rows[i]["unit_id"]),
                        text = dt.Rows[i]["unit_name"].ToString()
                    };
                    unitLst.Add(dtup);
                }
            }
            return unitLst;
        }
}

下面,新建web应用程序-添加-一般处理程序,其中JavaScriptSerializer你可以换为NewtonSoft来处理

public void ProcessRequest(HttpContext context)
{
      JavaScriptSerializer js = new JavaScriptSerializer();
      context.Response.ContentType = "application/json";
      UnitComponent uc = new SynUser.UnitComponent();
      var unit = uc.GetUnit();
      context.Response.Write("[" + js.Serialize(unit) + "]");
}

现在我们测试一下这个一般处理程序,如果像图片一样返回了结果说明正确:

好了,部门结构的数据准备好了,下开始写前台代码:

新建一个aspx页面,拖一个控件

<asp:TextBox ID="tbUnit" runat="server" Width="280px"></asp:TextBox>

引入相应的js,在script加入代码

$(‘#tbUnit‘).combotree({
    url: , ‘/unit.ashx‘
    cascadeCheck: true,
    placeholder: "请选择部门",
    method: ‘get‘,
    required: true,
    multiple: true,
    onChange: function (newValue, oldValue) {
        computeunit();
    },
    onLoadSuccess: function (node, data) {

    }
});

不知你有没有发现我选中的是应用管理服务中心、xiaobo、tech三个节点,但是xiaobo、tech是应用服务中心的叶子节点。需求要求,我们只需获取应用管理服务中心节点,不需要在获取xiaobo、tech。

所有要通过js遍历tree来获取我们想要的节点,computerunit方法是我们想要的。

思路为:递归获取被选的子节点,然后与所选的节点作差集,最后的得到的就是被选的节点(不包括全选的子节点)

    function computeunit() {
            var arr = new Array();
            var selectstr = $("#tbUnit").combotree("getValues").toString();
            var select = selectstr.split(",");
            var t = $(‘#tbUnit‘).combotree(‘tree‘);    // get the tree object
            var n = t.tree(‘getChecked‘);        // get selected node
            unitrecursive(t, n, arr);
            alert(subtraction(select, arr).join(","));
        }

        /*计算数组差集
        **返回结果数组
        */
        function subtraction(arr1, arr2) {
            var res = [];
            for (var i = 0; i < arr1.length; i++) {
                var flag = true;
                for (var j = 0; j < arr2.length; j++) {
                    if (arr2[j] == arr1[i]) {
                        flag = false;
                    }
                }
                if (flag) {
                    res.push(arr1[i]);
                }
            }
            return res;
        }

        /*获取被选父节点的子项目
        **返回结果arr里
        */
        function unitrecursive(t, nodes, arr) {
            for (var i = 0; i < nodes.length; i++) {
                if (!t.tree(‘isLeaf‘, nodes[i].target)) {
                    var nn = t.tree(‘getChildren‘, nodes[i].target);
                    for (var j = 0; j < nn.length; j++) {
                        arr.push(nn[j].id);
                    }
                    unitrecursive(t, nn, arr);
                }
            }
        }

转载请标明出处

标签: ComboTreeJson一般处理程序递归

时间: 2024-10-18 23:30:08

ComboTree的相关文章

EasyUI ComboTree(树形下拉框) 简单实例

前台: <input id="cc">   <script type="text/javascript"> $('#cc').combotree({ required: true }).combotree("tree").tree({ url: 'tree.ashx?id=0&state=closed', checkbox: false, onBeforeExpand: function (node, param)

ComboTree( 树型下拉框) 组件

本节课重点了解EasyUI中Tree(树)组件的使用方法, 这个组件依赖于Combo(下拉框)和 Tree(树)组件.一. 加载方式//class 加载方式<select id="cc" class="easyui-combotree" style="width:200px;"data-options="url:'tree.json',required:true"></select>//JS 加载方式&

Easyui控制combotree只能选择叶子节点

$(function() { $('#tt').combotree({ url: 'getTree.do', onBeforeSelect: function(node) { if (!$(this).tree('isLeaf', node.target)) { return false; } }, onClick: function(node) { if (!$(this).tree('isLeaf', node.target)) { $('#tt').combo('showPanel');

ComboTree 的json格式和引用

在easyui内,用 <select>实现combotree. <td ><select class="easyui-combotree" url="json/city_data.json" name="newprof" style="width:156px;"/></td> JSON格式: [{ "id":"HQ", "text

combobox和combotree模糊查询

First /** * combobox和combotree模糊查询 * combotree 结果显示两级父节点(手动设置数量) * 键盘上下键选择叶子节点 * 键盘回车键设置文本的值 */ (function(){ //combobox可编辑,自定义模糊查询 $.fn.combobox.defaults.editable = true; $.fn.combobox.defaults.filter = function(q, row){ var opts = $(this).combobox('

EasyUI ComboTree数据绑定树形分类显示

承接上篇博文[LINQ获取树形分类的层数].在上文中,笔者只分享了层数,在这里我把完整的实现贴出来,欢迎批评指正. 先附上效果图: 首先是Tree公共类 public class Tree { public int ModuleID { get; set; } public int ParentID { get; set; } public int ModulePath { get; set; } public string ModuleName { get; set; } } 接下来就是Tre

easyui combotree combobox 使用例子

一:引入easyui 二:使用例子 <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <link href="Resurces/themes/easyui.css" rel="stylesheet" /> <link href="Resur

EasyUI——combotree

扩展自 $.fn.combo.defaults 和 $.fn.tree.defaults.通过 $.fn.combotree.defaults 重写默认的 defaults. 组合树(combotree)把选择控件和下拉树结合起来.它与组合框(combobox)相似,不同的是把列表替换成树组件. 组合树(combotree)支持带有用于多选的树状态复选框的树. 从标记创建组合树(combotree). 1 <select id="cc" class="easyui-co

easyui学习记录:combotree的使用

一.简介: combotree控件是对combo(自定义下拉框)与tree(树)控件的扩展,它与combobox(下拉列表框)类似,但是它将下拉列表框的列表替换成了树.该控件支持树状态的复选框从而实现多选. 1.属性 树形下拉框的属性扩展自combo与tree,其重写的属性如下: 属性名 属性值类型 描述 默认值 editable boolean 定义用户是否可以直接输入文本到字段中. false 2.方法 树形下拉框的方法扩展自combo(自定义下拉框),其重写和新增的方法如下: 方法名 方法