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

知识点: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. }

处理类设计:

  1. public class UnitComponent
  2. {
  3. ExeceteOralceSqlHelper SqlHelper= new ExeceteOralceSqlHelper();//数据库处理类
  4. public UnitParent GetUnit()
  5. {
  6. Unit rootUnit = new Unit();
  7. rootUnit.id = ;
  8. rootUnit.text = "BO API";
  9. rootUnit.children = GetUnitList();
  10. UnitRecursive(rootUnit.children);
  11. return rootUnit;
  12. }
  13.  
  14. /// <summary>
  15. /// 递归查询部门
  16. /// </summary>
  17. /// <param name="units"></param>
  18. private void UnitRecursive(List<Unit> units)
  19. {
  20. foreach (var item in units)
  21. {
  22. item.children = GetUnitList(item.id);
  23. if (item.children != null && item.children.Count > )
  24. {
  25. item.state = "closed";
  26. UnitRecursive(item.children);
  27. }
  28. }
  29. }
  30.  
  31. /// <summary>
  32. /// 通过parentID获取所有子部门
  33. /// </summary>
  34. /// <param name="parentID">父id</param>
  35. /// <returns>返回Unit集合</returns>
  36. private List<Unit> GetUnitList(decimal parentID)
  37. {
  38. List<Unit> unitLst = new List<Unit>();
  39. string sql = string.Format("select hh.unit_id,hh.unit_name from unit_main hh where hh.parent_id={0}", parentID);
  40. DataTable dt = SqlHelper.ExecuteDataTable(sql);//返回DataTable方法
  41. if (dt != null && dt.Rows.Count > )
  42. {
  43. for (int i = ; i < dt.Rows.Count; i++)
  44. {
  45. Unit dtup = new Unit()
  46. {
  47. id = Convert.ToInt32(dt.Rows[i]["unit_id"]),
  48. text = dt.Rows[i]["unit_name"].ToString()
  49. };
  50. unitLst.Add(dtup);
  51. }
  52. }
  53. return unitLst;
  54. }
  55. }

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

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

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

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

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

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

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

  1. $('#tbUnit').combotree({
  2. url: , '/unit.ashx'
  3. cascadeCheck: true,
  4. placeholder: "请选择部门",
  5. method: 'get',
  6. required: true,
  7. multiple: true,
  8. onChange: function (newValue, oldValue) {
  9. computeunit();
  10. },
  11. onLoadSuccess: function (node, data) {
  12.  
  13. }
  14. });

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

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

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

  1.     function computeunit() {
  2. var arr = new Array();
  3. var selectstr = $("#tbUnit").combotree("getValues").toString();
  4. var select = selectstr.split(",");
  5. var t = $('#tbUnit').combotree('tree'); // get the tree object
  6. var n = t.tree('getChecked'); // get selected node
  7. unitrecursive(t, n, arr);
  8. alert(subtraction(select, arr).join(","));
  9. }
  10.  
  11. /*计算数组差集
  12. **返回结果数组
  13. */
  14. function subtraction(arr1, arr2) {
  15. var res = [];
  16. for (var i = 0; i < arr1.length; i++) {
  17. var flag = true;
  18. for (var j = 0; j < arr2.length; j++) {
  19. if (arr2[j] == arr1[i]) {
  20. flag = false;
  21. }
  22. }
  23. if (flag) {
  24. res.push(arr1[i]);
  25. }
  26. }
  27. return res;
  28. }
  29.  
  30. /*获取被选父节点的子项目
  31. **返回结果arr里
  32. */
  33. function unitrecursive(t, nodes, arr) {
  34. for (var i = 0; i < nodes.length; i++) {
  35. if (!t.tree('isLeaf', nodes[i].target)) {
  36. var nn = t.tree('getChildren', nodes[i].target);
  37. for (var j = 0; j < nn.length; j++) {
  38. arr.push(nn[j].id);
  39. }
  40. unitrecursive(t, nn, arr);
  41. }
  42. }
  43. }

转载请标明出处

Asp.net下拉树实现(Easy UI ComboTree)的更多相关文章

  1. zTree开发下拉树

    最近,因为工作需要一个树形下拉框的组件,经过查资料一般有两种的实现方法.其一,就是使用zTree实现:其二,就是使用easyUI实现.因为公司的前端不是使用easyUI设计的,故这里我选择了zTree ...

  2. 开源框架.netCore DncZeus学习(五)下拉树的实现

    千里之行,始于足下,先从一个小功能研究起,在菜单管理页面有一个下拉树,先研究下它怎么实现的 1.先找到menu.vue页面 惯性思维先搜索请选择三个字,原来是动态生成的 再向上找DropDown组件, ...

  3. vue 模拟下拉树

    // 使用vue 做表格部分其他部分暂不修改 var app = new Vue({ el: "#freightTbl", watch: { //监听表格数据的变化[使用 watc ...

  4. vue-Treeselect实现组织机构(员工)下拉树的功能

    知识点:前端使用vuetree的组件库,调用后台查询组织机构,包括人员的接口 实现下拉树的功能 查考: vue-treeselect官网:https://vue-treeselect.js.org/ ...

  5. Extjs下拉树代码测试总结

    http://blog.csdn.net/kunoy/article/details/8067801 首先主要代码源自网络,对那些无私的奉献者表示感谢! 笔者对这些代码做了二次修改,并总结如下: Ex ...

  6. EXTJS下拉树ComboBoxTree参数提交及回显方法

    http://blog.csdn.net/wjlht/article/details/6085245 使用extjs可以构造出下拉数,但是不方便向form提交参数,在此,笔者想到一个办法,很方便Com ...

  7. layui扩展组件,下拉树多选

      项目介绍 项目中需要用到下拉树多选功能,找到两个相关组件moretop-layui-select-ext和wujiawei0926-treeselect,但是moretop-layui-selec ...

  8. vue+element下拉树选择器

    项目需求:输入框点击弹出树形下拉结构,可多选或者单选. 解决方案:1.使用layui formSelect多选插件 2.基于vue+elementui 下拉框和树形控件组合成树形下拉结构 <el ...

  9. EasyUI-combotree 下拉树 数据回显时默认选中

    组合树(combotree)把选择控件和下拉树结合起来.它与组合框(combobox)相似,不同的是把列表替换成树组件.组合树(combotree)支持带有用于多选的树状态复选框的树. 依赖 comb ...

随机推荐

  1. sencha touch 扩展篇之将sencha touch打包成安装程序(下)- 使用phonegap打包安装程序

        这讲我们来讲解下如何使用phonegapa创建项目环境并通过她们将sencha touch打包成app,这里我们只讲解打包android的apk,打包ios的过程有点类似,但是需要在mac环境 ...

  2. 微信小游戏 小程序与小游戏获取用户信息接口调整 wx.createUserInfoButton

    参考: 小程序•小故事(6)——微信登录能力优化 小程序•小故事(4)——获取用户信息 本篇主要是讲微信getUserInfo接口不再出现授权弹框 那么原来getUserInfo是怎么样?修改之后又是 ...

  3. jquery.js与sea.js综合使用

    jquery.js与sea.js综合使用   目录 模块定义 define id dependencies factory exports require require.async require. ...

  4. js调试模式怎么看变量是在哪里定义的?

    1. 2.

  5. postgresql----唯一索引,表达式索引,部分索引

    一.唯一索引 唯一索引字面上理解就是在索引上增加唯一约束,不允许出现索引值相同的行,目前只有Btree索引可以声明唯一索引,唯一键会自动创建唯一索引. 测试表: test=# create table ...

  6. 170724、springboot编程之完整demo

    综合之前学习,参考网上各大神博客,写了一个小demo,需要的朋友可以参考一下! 项目地址:https://github.com/zrbfree/spring-boot-anna.git

  7. pta 习题集5-19 列车厢调度

    1 ====== <--移动方向 / 3 ===== \ 2 ====== -->移动方向 大家或许在某些数据结构教材上见到过"列车厢调度问题"(当然没见过也不要紧). ...

  8. 软件IT

    软件IT 周期: 攻防:攻击性板块 范畴:科技板块 业务:软件,互联网,人工智能,区块链... 行情主要因素: 主要问题:新领域,成长不确定性高 投资策略: 个股:科大讯飞,中国软件,用友网络,浪潮信 ...

  9. Ubuntu操作异常汇总

    1.使用Ubuntu的apt-get安装软件时出现以下错误: Reading package lists... Done Building dependency tree... Done Packag ...

  10. 数据库触发器,禁止DDL操作

    CREATE TRIGGER [Object_Change_Trigger_DDL] ON DATABASE FOR ALTER_TABLE,DROP_TABLE,CREATE_TABLE,CREAT ...