最近在一个项目中需要用到无限分类的平铺多选,单选这些功能,查了一些资料,结果大都是一些用IFrame这样的东西做的,虽然用起来直观,但本人更喜欢集成控件形式的,于是抽了一些时间做了一个.思路是利用控件+JS+不同的无限分类表,支持一页多控件,支持不同的无限分类表.效果图如下:

当这些父类被选择时,子类都被选择.当这些父类取消选择时,其下所有子类都被取消选择.

代码如下:

控件behind代码CS:

MultiSelectItems.ascx.cs

1 usingSystem;2 usingSystem.Collections;3 usingSystem.Collections.Generic;4 usingSystem.Configuration;5 usingSystem.Data;6 usingSystem.Linq;7 usingSystem.Web;8 usingSystem.Web.Security;9 usingSystem.Web.UI;10 usingSystem.Web.UI.HtmlControls;11 usingSystem.Web.UI.WebControls;12 usingSystem.Web.UI.WebControls.WebParts;13 usingSystem.Xml.Linq;14 usingModels;15 16 publicpartialclassMultiSelectItems : System.Web.UI.UserControl17 {18 publicList<Groups>groupList {get;set; }19 20 publicstringhasSel21 {22 set23 {24 if(!string.IsNullOrEmpty(value))25 {26 //绑定已选数据27 value=value.Trim(',');28 string[] hasSels=value.Split(',');29 foreach(stringsinhasSels)30 {31 scriptStr+="document.getElementById('checkItems"+tableName+s+"').checked=true;\r\n";32 scriptStr+="checkProperty('"+tableName+"',"+s+",'"+controlName+"');\r\n";33 }34 scriptStr+="document.getElementById('checkeds"+tableName+"').value='"+value+",';\r\n";35 }36 }37 }38 publicstringtableName {get;set; }39 publicstringcontrolName {get;set; }40 publicstringscriptStr=string.Empty;41 publicstringmultiItemsInnerHtml=string.Empty;42 protectedvoidPage_Load(objectsender, EventArgs e)43 {44 //此控件配合JS使用45 //使用方法:46 //在页面顶部加载此控件:<%@ Register Src="~/controls/MultiSelectItems.ascx" TagName="mi" TagPrefix="MultiSelectItem" %>47 //在head中加载相应JS:<script language="javascript" src="/controls/MultiSelectItems.js" type="text/javascript"></script>48 //在页面相关位置放置此控件:<MultiSelectItem:mi runat="server" ID="miArea" />ID不受限制49 //配置一些属性50 //miArea.st = SysTable.AreaGroups;//加载哪个表51 //miArea.controlName = "checkedsAreaGroups";//要获取值的text控件名52 //miArea.BindData();//绑定初始数据53 //如果是修改选项,可以设置已有选项:miArea.hasSel = sm.Area_Items;54 //获取该控件的值,这个名称就是刚刚配置的名称:Request.Form["checkedsAreaGroups"]55 }56 ///<summary>57 ///绑定初始的多选表单数据,这些数据都是未被选择的,如果要选择数据,请设置该对象相关实例的hasSel属性58 ///</summary>59 publicvoidBindData()60 {61 stringbrStr=string.Empty;62 stringclickStr=string.Empty;63 stringtpGroupName=string.Empty;64 stringtpBox=string.Empty;65 if(groupList!=null)66 {67 foreach(Groups gpingroupList)68 {69 brStr=string.Empty;70 clickStr="checkAllSubProperty('"+tableName+"','"+gp.GroupId+"','"+controlName+"')";71 tpBox="<input type='checkbox' name='checkItems"+tableName+"' id='checkItems"+tableName+gp.GroupId+"' value='"+gp.ParentStr+gp.GroupId+"' οnclick=\""+ clickStr +"\"/>\r\n";72 if(gp.Route==1) {73 tpGroupName=gp.GroupName.Substring(1);74 }75 elseif(gp.Route==2)76 {77 tpGroupName=gp.GroupName.Substring(1);78 }79 else{80 tpGroupName=gp.GroupName.Substring(gp.Route-1);81 }82 83 84 if(gp.Route==1)85 {86 brStr="<br />";87 multiItemsInnerHtml+=brStr+tpBox+"<span style='color:#FF7500;font-weight:bold;'>"+tpGroupName+"</span>";88 }89 else90 {91 if(groupList.Where(c=>c.ParentId==gp.GroupId).Count()>0)92 {93 brStr="<br />";94 multiItemsInnerHtml+=brStr+tpBox+"<span style='font-weight:bold;'>"+tpGroupName+"</span>";95 }96 else97 {98 multiItemsInnerHtml+=tpBox+tpGroupName;99 }100 }101 multiItemsInnerHtml+="&nbsp;&nbsp;";102 multiItemsInnerHtml+=brStr;103 }104 }105 }106 }

html代码很简单:

MultiSelectItems.ascx

<%@ Control Language="C#"AutoEventWireup="true"CodeBehind="MultiSelectItems.ascx.cs"Inherits="MultiSelectItems"%><divid="MultiItems<%=tableName%>"><%=multiItemsInnerHtml%></div><inputtype="hidden"name="<%=controlName%>"id="<%=controlName%>"value=""/><scriptlanguage="javascript"type="text/javascript"><%=scriptStr%></script>

接下来是相关的JS,注意,不论一个页面调用几次这个控件,此JS只加载一次

MultiSelectItems.js

functioncheckAllSubProperty(tableName,groupid,checkedsControlName){varcheckedControl=document.getElementById("checkItems"+tableName+groupid);varitems=document.getElementsByName("checkItems"+tableName);varcheckeds=document.getElementById(checkedsControlName);if(checkedControl.checked){
            checkeds.value
+=groupid+',';
        }
else{
            checkeds.value
=checkeds.value.replace(groupid+",","");
        }
for(vari=0;i<items.length;i++){if(items.item(i).value.indexOf(','+groupid+',')>-1){varinsertStr=items.item(i).value.substring(items.item(i).value.lastIndexOf(',')+1,items.item(i).value.length)+',';if(checkedControl.checked){
                    items.item(i).checked
=true;if(checkeds.value.indexOf(insertStr)<0){
                        checkeds.value
+=insertStr;
                    }
                }
else{
                    items.item(i).checked
=false
                    checkeds.value
=checkeds.value.replace(insertStr,"");
                }
            }
        }        
    }

因为是基于.net 3.5的Linq做的控件,所以,此控件必须运行在装有3.5类库的机器上,而且,因为无限分类的数据库结构大家都清楚.是这样的:

稍微解释一下各字段含义:

GroupId:这是分类的主ID,自动增加,主键.

GroupName:这是分类的名字.

ParentId:这是父类的ID,

ParentStr:这是从根类--->父类---->父类....--->本类的父类的路径,以0开始,以,结束,例如0,2,10,22,这从算法上讲叫静态冗余字段,用来快速查找某个类的所有子类.例如要查找GroupId为2的所有子类,可以这样写语句:select top xx * from 表名 where ParentStr like '%,2,%',是不是比一般的遍历要快很多?

Route:这是指示该类的路径深度,如果是根类,则为1,如果是1级子类,则为2,依此类推,此字段主要用于快速查找某一级别的所有子类.

至于这个无限分类的维护,大家可以各显其能去优化.目前我的维护是采用缓存+List<>+ORM

我写的东西大都是日常工作中用得比较多的,而且,相对来说,我会比较偷懒,例如,减少计算,减少数据库访问等.而且,本人不喜欢一个大括号里有很多条语句的代码方式.这样的代码比较难维护.如果我看到一个if或者while后接了一个大括号,然后整屏都看不到它的结束符.我会BS这段代码的作者.

f人要

转载于:https://www.cnblogs.com/CoreCaiNiao/archive/2009/12/01/1614665.html

关于一个无限分类的多选,单选相关的控件相关推荐

  1. 一个类似抖音 APP 拍摄按钮效果的控件

    TouchButton 一个类似抖音 APP 拍摄按钮效果的控件 效果图预览 用法 <net.angrycode.library.TouchButtonandroid:id="@+id ...

  2. easyui数据表格显示复选框_WinCC 报警控件、在线趋势/表格控件数据查询

    1.报警控件数据查询 在WinCC报警记录组态时,我们可以给报警消息定义不同的类别.类型.用户文本块等(图1),有了以上的组态,我们就可以自定义过滤条件,在报警控件中查询或显示分类的报警信息. 图 1 ...

  3. 2019数据安装勾选_如何安装勾选认证平台安全控件,以及如何勾选认证发票

    我们继续来关注增值税发票勾选平台的常见问题! 很多客户留言说勾选认证控件不会安装? 不知道怎么勾选认证发票? 不知道勾选认证平台的域名网址? 不知道发票勾选是否认证成功? 好的,以上这些常见问题我们来 ...

  4. (转)一个带自定义分页,排序功能的DATAGRID控件(公开源码)

      因为项目需要,要弄个有这样功能的控件.要有自定意分页和排序的功能.在这个控件里面数据的绑定都是用DataView来实现,DataView放在Session里,如果大家有更灵活的方法可以留言给我.S ...

  5. android 多个复选框,Android UI控件之CheckBox(复选框、多选框)

    上一篇文章中学习了RadioButton.知道了RadionButton的基本用法,实现起来也是听简单的 和RadioButton一样CheckBox也是一个使用的非常多的控件,Android中它的的 ...

  6. matlab figure函数_如何在Matlab中使用GUI做一个简易音乐播放器? ---- (六)控件间的数据传递...

    我纠结了两个星期是否要写这一章-最后决定还是要写一章收尾,来解释其中的控件间的数据传递问题. 在前五篇中,如果有童鞋跟上了我的思路或者做完了这样一个gui,会发现还有一个一直避开的遗留问题,就是将歌曲 ...

  7. 推荐一个超人气的类似MSN弹出的控件

    推荐一个非常好的类似MSN的控件,使用效果如下: 在线演示 http://www.eeeksoft.net/files/popuptest 源文地址请参考: http://www.codeprojec ...

  8. qt 定义一个长度的数组_Qt设计器:创建控件数组

    也许这是一个愚蠢的问题,但我是新来的C + +和Qt.抱歉给您带来不便.Qt设计器:创建控件数组 在Qt Designer中,我创建多个标签(例如): my_label1 my_label2 my_l ...

  9. 肝一个嵌入式日历吧!LVGL『Calendar日历控件』介绍

    一. LVGL GUI日历控件的概念 LVGL做的日历空间还是比较好看的,而且需要我们做的事情很少,LVGL的日历控件有以下功能 突出显示当天 突出显示任何用户定义的日期 显示日期名称 单击按钮进入下 ...

最新文章

  1. 关于springboot vue前后端分离项目部署到阿里云轻量服务器(前后端分开部署)
  2. Java:使用synchronized和Lock对象获取对象锁
  3. java web三:反射
  4. “直播第一股”映客,讲得好社交新故事吗?
  5. vue-devtools chrome 开发工具
  6. DOM-4 【utils/待讲评】节点创建删除、元素属性设置获取、节点属性
  7. java导出excel_java按需导出Excel并自动合同单元格
  8. 2021年中国宠物玩具与训练市场趋势报告、技术动态创新及2027年市场预测
  9. 晕晕沉沉的一天,ISAPI_Rewrite 2.9破解版竟然是假的
  10. 漏洞扫描工具Nessus的下载与安装教程
  11. 三代悦虎1562A来袭!相比其他方案到底怎样?
  12. C语言基础之汉语拼音读数字
  13. Android开发之视频播放器
  14. GoLang官网怎么查看“包“文档
  15. 生动形象解释虚数的意义
  16. 5G毫米波Vs毫米波通信模块
  17. 计算机组成原理概念学习DAY7——外围设备
  18. 浙江大学计算机博士申请考核,考博经验 | 2020年浙江大学博士申请考核经验分享...
  19. NTP服务端和客户端的部署——Chrony
  20. 湖南财务大数据比赛代码2018-12-20

热门文章

  1. python pandas常用函数_Python pandas常用函数详解
  2. linux 查询wwid命令,linux肿么查看硬盘的wwid
  3. 对象特性--构造函数调用规则
  4. MySQL面试题 | 附答案解析(一)
  5. zoj-3228 Searching the String AC自动机
  6. win10 error LNK1112: 模块计算机类型“X86”与目标计算机类型“x64”冲突
  7. 属性匹配工具_测试工具链——高效构建Mock服务
  8. PDAL点云处理库介绍
  9. keras中conv2d,conv2dTranspose的Padding详细介绍
  10. Ubuntu 14.04 64bit安装IPython