1.首先我们正常数据是如下所示:
[
{ id: 1, pid: 0, name: '公司组织' },
{ id: 2, pid: 1, name: '总经办' },
{ id: 3, pid: 1, name: '人事部' },
{ id: 4, pid: 1, name: '生产部' },
{ id: 5, pid: 4, name: '现场组' },
{ id: 6, pid: 4, name: '组装组' },
]
 
2.我们最好在后台组装成json格式数据,如下显示:
[
{ id: 1, pid: 0, name: '公司组织',
 children:[
   { id: 2, pid: 1, name: '总经办'}
   { id: 3, pid: 1, name: '人事部' }
   { id: 4, pid: 1, name: '生产部' },children:[{ id: 5, pid: 4, name: '现场组' }{ id: 6, pid: 4, name: '组装组' }]},
   ]
},
{ id: 1, pid: 0, name: '公司组织',
 children:[
   { id: 2, pid: 1, name: '总经办'}
   { id: 3, pid: 1, name: '人事部' }
   { id: 4, pid: 1, name: '生产部' },children:[{ id: 5, pid: 4, name: '现场组' }{ id: 6, pid: 4, name: '组装组' }]},
   ]

},

]
 
3.后台代码使用递归:
public string GetOrganizationTreeJson()
        {
            StringBuilder sbResult = new StringBuilder();
            IList<SYS_Organization> orgList = sysPublicService.GetOrganizationList();//获取所有组织机构数据
            if (orgList.Count > 0)
            {
                sbResult.Append("[{\"id\":0,\"name\": \"组织机构\",\"children\": ");
                sbResult.Append(CreateOrganizationTreeJsonByModel(orgList, null));
                sbResult.Append("}]");
            }
            else
            {
                sbResult.Append("[{\"id\":0,\"name\": \"组织机构\",\"children\": []}]");
            }
            return sbResult.ToString();
        }
private string CreateOrganizationTreeJsonByModel(IList<SYS_Organization> list, string pId)
        {
            StringBuilder sbResult = new StringBuilder();
            if (list.Count > 0)
            {
                sbResult.Append("[");
                IList<SYS_Organization> models = list.Where(m => m._parentId == pId).ToList();
                if (models.Count > 0)
                {
                    foreach (SYS_Organization m in models)
                    {
                        sbResult.Append("{\"id\":\"" + m.org_id + "\",\"name\":\"" + m.org_name + "(" + m.org_code + ")\",\"state\":\"open\"");
                        if (list.Count(mm => mm._parentId == m.org_id) > 0)
                        {
                            sbResult.Append(",\"children\":");
                            sbResult.Append(CreateOrganizationTreeJsonByModel(list, m.org_id));
                        }
                        sbResult.Append("},");
                    }
                    sbResult = sbResult.Remove(sbResult.Length - 1, 1);
                }

sbResult.Append("]");
            }

return sbResult.ToString();
        }

 
4.在网页中添加下拉框容器
<select id="selectbox" name=""></select>
 
5.js脚本,递归生成
//获取容器对象
var selectbox=document.getElementById("selectbox");
//生成树下拉菜单
var j="-";//前缀符号,用于显示父子关系,这里可以使用其它符号
function creatSelectTree(d){
 var option="";
 for(var i=0;i<d.length;i++){
 if(d[i].children!= undefined){//如果有子集
  option+="<option value='"+d[i].id+"'>"+j+d[i].name+"</option>";
 j+="-";//前缀符号加一个符号
  option+=creatSelectTree(d[i].children);//递归调用子集
 j=j.slice(0,j.length-1);//每次递归结束返回上级时,前缀符号需要减一个符号
  }else{//没有子集直接显示
  option+="<option value='"+d[i].id+"'>"+j+d[i].name+"</option>";
  }
  }
 return option;//返回最终html结果
 }
//调用函数,并将结构出入到下拉框容器中
selectbox.innerHTML=creatSelectTree(tree);
 
6.页面效果图
 
 
 
 

js生成tree形组织机构下拉框的更多相关文章

  1. js实现可输入的下拉框

    <HTML> <HEAD> <META http-equiv='Content-Type' content='text/html; charset=gb2312'> ...

  2. Vue.js中使用select选择下拉框

    在Vue.js中使用select选择下拉框有两种方法: 第一种: Add.html: <select v-model="sysNotice.noticeType" id=&q ...

  3. js基于json的级联下拉框

    级联下拉列表是项目中常用到的.比如省市县,比如企业性质等,做成一个js通用组件, 在静态页出来后可以直接插入,将数据和html静态页做一个解耦. 贴出来抛砖引玉吧. /** * @author sun ...

  4. Java使用poi生成Excel,生成两种表格下拉框

    想要使用POI操作以xsl结尾的Excel,首先要下载poi相关的jar包,用到的jar有: poi-3.9.jar poi-ooxml-3.9.jar poi-ooxml-schemas-3.9.j ...

  5. 手把手教学~基于element封装tree树状下拉框

    在日常项目开发中,树状下拉框的需求还是比较常见的,但是element并没有这种组件以供使用.在这里,小编就基于element如何封装一个树状下拉框做个详细的介绍. 通过这篇文章,你可以了解学习到一个树 ...

  6. FineReport——JS二次开发(下拉框)

    下拉框显示多列时,输入的内容检索的内容为显示值整行数据,而不是实际值. 下拉框选择之后,控件显示的是显示值而非实际值. 对于下拉框显示队列,可以有多种方法,但是经过测试大多数方法不适用,检索效率太低, ...

  7. 用js实现两个select下拉框之间的元素互相移动

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. js中年份、月份下拉框

    <select id="year" style="width: 100px;"></select> <select id=&quo ...

  9. 下拉框多级联动辅助js,优化您的下拉框

    function IniteSelect(options) { $("body").IniteSelect(options) } (function ($) { $.fn.Init ...

随机推荐

  1. ssl简介与openssl的使用

    SSL证书:  是数字证书的一种,类似于驾驶证.护照和营业执照的电子副本.因为配置在服务器上,也称为SSL服务器证书. ssl也是传输协议. 基于ssl协议开发的一款软件叫openssl linux系 ...

  2. Java与Netty实现高性能高并发

    摘要: 1. 背景 1.1. 惊人的性能数据 最近一个圈内朋友通过私信告诉我,通过使用Netty4 + Thrift压缩二进制编解码技术,他们实现了10W TPS(1K的复杂POJO对象)的跨节点远程 ...

  3. MYSQL批量删除大量数据

    DELETE FROM '表' WHERE '字段'=1 会发现删除失败,因为lock wait timeout exceed的错误: 通过LIMIT参数分批删除,因为如果不用limit,删除大量数据 ...

  4. Selenium Extent Report的设置

    Extent Report需要在线加载css,不然生成的html report会很难看. 但可以设置不在线加载css,而是使用本地css,在使用htmlreporter加上这句 htmlReporte ...

  5. 微信小程序-if条件渲染

    #index.wxml <view>今天吃啥</view> <view wx:if="{{condition==1}}"> 饺子 </vi ...

  6. 在Tomcat文件中,点击start.bat启动的是另一个tomcat

    遇到问题:在下载了一个免安装的Tomcat7之后解压,点击startup.bat启动tomcat,却报了异常. 后来在电脑一个文件夹中发现了另一个Tomcat8,是安装版本,并配置了环境变量.其环境变 ...

  7. 基于Dapper写的一个sqlhelp适用于多版本数据库

    ConnectionInit方法用于初始化数据库连接对象, 只需要修改databasetype参数即可进行适用各个版本的数据库, ExecuteNonQuery方法用于执行增.删.改操作,返回受影响的 ...

  8. html初识form表单

    定义和用法 <form> 标签用于为用户输入创建 HTML 表单. 表单能够包含 input 元素,比如文本字段.复选框.单选框.提交按钮等等. 表单用于向服务器传输数据.通过submit ...

  9. docker for ubuntu 18 安装

    官网地址: https://docs.docker.com/install/linux/docker-ce/ubuntu/ docker的作用:解决不同机器之间的环境差异问题,方便迁移. 0. 卸载旧 ...

  10. pythond的icmp广播报获取局域网主机IP

    icmp广播报获取局域网四川特产IP from scapy.all import *import randomimport threading def scan(sip,dip): pkt = Eth ...