Asp.net下拉树实现(Easy UI ComboTree)
场景描述:某个公司有多个部门并且部门存在子部门,通过一个下拉框选取多个部门,但是如果某个部门的子部门被全部选择,则只取该部门,而忽略子部门。(叶子节点全被选中时,只取父节点)
知识点:ComboTree、一般处理程序、递归、Json
效果如图
数据库表设计:unit_main
unit_id |
unit_name |
parent_id |
desc |
部门ID |
部门名称 |
父ID |
说明 |
节点类设计:
- public class Unit
- {
- public decimal id { get; set; }
- public string text { get; set; }
- public string state { get; set; }
- public List<Unit> children { get; set; }
- public Unit ()
- {
- this.children = new List<Unit>();
- this.state = "open";
- }
- }
处理类设计:
- public class UnitComponent
- {
- ExeceteOralceSqlHelper SqlHelper= new ExeceteOralceSqlHelper();//数据库处理类
- public UnitParent GetUnit()
- {
- Unit rootUnit = new Unit();
- rootUnit.id = ;
- rootUnit.text = "BO API";
- rootUnit.children = GetUnitList();
- 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 > )
- {
- 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 > )
- {
- for (int i = ; 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);
- }
- }
- }
转载请标明出处
Asp.net下拉树实现(Easy UI ComboTree)的更多相关文章
- zTree开发下拉树
最近,因为工作需要一个树形下拉框的组件,经过查资料一般有两种的实现方法.其一,就是使用zTree实现:其二,就是使用easyUI实现.因为公司的前端不是使用easyUI设计的,故这里我选择了zTree ...
- 开源框架.netCore DncZeus学习(五)下拉树的实现
千里之行,始于足下,先从一个小功能研究起,在菜单管理页面有一个下拉树,先研究下它怎么实现的 1.先找到menu.vue页面 惯性思维先搜索请选择三个字,原来是动态生成的 再向上找DropDown组件, ...
- vue 模拟下拉树
// 使用vue 做表格部分其他部分暂不修改 var app = new Vue({ el: "#freightTbl", watch: { //监听表格数据的变化[使用 watc ...
- vue-Treeselect实现组织机构(员工)下拉树的功能
知识点:前端使用vuetree的组件库,调用后台查询组织机构,包括人员的接口 实现下拉树的功能 查考: vue-treeselect官网:https://vue-treeselect.js.org/ ...
- Extjs下拉树代码测试总结
http://blog.csdn.net/kunoy/article/details/8067801 首先主要代码源自网络,对那些无私的奉献者表示感谢! 笔者对这些代码做了二次修改,并总结如下: Ex ...
- EXTJS下拉树ComboBoxTree参数提交及回显方法
http://blog.csdn.net/wjlht/article/details/6085245 使用extjs可以构造出下拉数,但是不方便向form提交参数,在此,笔者想到一个办法,很方便Com ...
- layui扩展组件,下拉树多选
项目介绍 项目中需要用到下拉树多选功能,找到两个相关组件moretop-layui-select-ext和wujiawei0926-treeselect,但是moretop-layui-selec ...
- vue+element下拉树选择器
项目需求:输入框点击弹出树形下拉结构,可多选或者单选. 解决方案:1.使用layui formSelect多选插件 2.基于vue+elementui 下拉框和树形控件组合成树形下拉结构 <el ...
- EasyUI-combotree 下拉树 数据回显时默认选中
组合树(combotree)把选择控件和下拉树结合起来.它与组合框(combobox)相似,不同的是把列表替换成树组件.组合树(combotree)支持带有用于多选的树状态复选框的树. 依赖 comb ...
随机推荐
- sencha touch 扩展篇之将sencha touch打包成安装程序(下)- 使用phonegap打包安装程序
这讲我们来讲解下如何使用phonegapa创建项目环境并通过她们将sencha touch打包成app,这里我们只讲解打包android的apk,打包ios的过程有点类似,但是需要在mac环境 ...
- 微信小游戏 小程序与小游戏获取用户信息接口调整 wx.createUserInfoButton
参考: 小程序•小故事(6)——微信登录能力优化 小程序•小故事(4)——获取用户信息 本篇主要是讲微信getUserInfo接口不再出现授权弹框 那么原来getUserInfo是怎么样?修改之后又是 ...
- jquery.js与sea.js综合使用
jquery.js与sea.js综合使用 目录 模块定义 define id dependencies factory exports require require.async require. ...
- js调试模式怎么看变量是在哪里定义的?
1. 2.
- postgresql----唯一索引,表达式索引,部分索引
一.唯一索引 唯一索引字面上理解就是在索引上增加唯一约束,不允许出现索引值相同的行,目前只有Btree索引可以声明唯一索引,唯一键会自动创建唯一索引. 测试表: test=# create table ...
- 170724、springboot编程之完整demo
综合之前学习,参考网上各大神博客,写了一个小demo,需要的朋友可以参考一下! 项目地址:https://github.com/zrbfree/spring-boot-anna.git
- pta 习题集5-19 列车厢调度
1 ====== <--移动方向 / 3 ===== \ 2 ====== -->移动方向 大家或许在某些数据结构教材上见到过"列车厢调度问题"(当然没见过也不要紧). ...
- 软件IT
软件IT 周期: 攻防:攻击性板块 范畴:科技板块 业务:软件,互联网,人工智能,区块链... 行情主要因素: 主要问题:新领域,成长不确定性高 投资策略: 个股:科大讯飞,中国软件,用友网络,浪潮信 ...
- Ubuntu操作异常汇总
1.使用Ubuntu的apt-get安装软件时出现以下错误: Reading package lists... Done Building dependency tree... Done Packag ...
- 数据库触发器,禁止DDL操作
CREATE TRIGGER [Object_Change_Trigger_DDL] ON DATABASE FOR ALTER_TABLE,DROP_TABLE,CREATE_TABLE,CREAT ...