当前位置: 首页 > 编程日记 > 正文

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

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

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

代码如下:

控件behind代码CS:

ContractedBlock.gifExpandedBlockStart.gifMultiSelectItems.ascx.cs
  1 using System;
  2 using System.Collections;
  3 using System.Collections.Generic;
  4 using System.Configuration;
  5 using System.Data;
  6 using System.Linq;
  7 using System.Web;
  8 using System.Web.Security;
  9 using System.Web.UI;
 10 using System.Web.UI.HtmlControls;
 11 using System.Web.UI.WebControls;
 12 using System.Web.UI.WebControls.WebParts;
 13 using System.Xml.Linq;
 14 using Models;
 15 
 16 public partial class MultiSelectItems : System.Web.UI.UserControl
 17 {
 18     public List<Groups> groupList { getset; }   
 19 
 20     public string hasSel
 21     {
 22         set
 23         {
 24             if (!string.IsNullOrEmpty(value))
 25             {
 26                 //绑定已选数据                    
 27                 value = value.Trim(',');
 28                 string[] hasSels = value.Split(',');
 29                 foreach (string s in hasSels)
 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     public string tableName { getset; }
 39     public string controlName { getset; }
 40     public string scriptStr = string.Empty;
 41     public string multiItemsInnerHtml = string.Empty;
 42     protected void Page_Load(object sender, 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     public void BindData()
 60     {
 61         string brStr = string.Empty;
 62         string clickStr = string.Empty;
 63         string tpGroupName = string.Empty;
 64         string tpBox = string.Empty;
 65         if (groupList != null)
 66         {
 67             foreach (Groups gp in groupList)
 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                 else if (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                 else
 90                 {
 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                     else
 97                     {
 98                         multiItemsInnerHtml +=  tpBox + tpGroupName;
 99                     }                    
100                 }
101                 multiItemsInnerHtml += "&nbsp;&nbsp;";
102                 multiItemsInnerHtml += brStr;
103             }
104         }
105     }
106 }

html代码很简单:

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

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

ContractedBlock.gifExpandedBlockStart.gifMultiSelectItems.js
    function checkAllSubProperty(tableName,groupid,checkedsControlName){
        
var checkedControl = document.getElementById("checkItems" + tableName + groupid);
        
var items = document.getElementsByName("checkItems" + tableName);
        
var checkeds = document.getElementById(checkedsControlName);
        
if(checkedControl.checked){
            checkeds.value 
+= groupid + ',';
        }
else{
            checkeds.value 
= checkeds.value.replace(groupid + ",","");
        }
        
for(var i=0;i<items.length;i++){
            
if(items.item(i).value.indexOf(',' + groupid + ','> -1){
                
var insertStr = 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

相关文章:

ubuntu如何修改字符集编码

系统支持编码的修改如下&#xff1a;1. 使用如下命令查看系统支持的字符集cat /usr/share/i18n/SUPPORTED说明&#xff1a;查看系统支持的字符集&#xff0c;你需要注意的是支持字符集的格式&#xff0c;如对中文会有以下一些显示&#xff08;我的系统如此&#xff0c;我不知是…

【怎样写代码】小技巧 -- 关于引用类型的两种转换方式

如果喜欢这里的内容&#xff0c;你能够给我最大的帮助就是转发&#xff0c;告诉你的朋友&#xff0c;鼓励他们一起来学习。 If you like the content here, you can give me the greatest help is forwarding, tell your friends, encourage them to learn together.

Oracle中的iot_type,oracle IOT表学习

IOT: Index-Organized Table索引组织表含义即将表结构整体放入索引中&#xff0c;且是按照主键进行排序的。创建&#xff1a;create table emp_iot(emp_no int,emp_name varchar2(100),dept_no int,salary number(10,2),constraint pk_empi primary key(emp_no, emp_name, dept…

如何查询并解决80端口 (转)

转自&#xff1a;http://www.cnblogs.com/chaofan/archive/2009/12/02/1615691.html 今天在使用apache的时候80端口被占用了&#xff0c;解决办法如下 在命令行里输入netstat -aon|findstr "80" 查看使用了80端口的tcp pid pid为1564 在任务管理器中将该进程结束掉即…

深证信息等三方拟联合开展大数据研究

昨日&#xff0c;深圳证券信息有限公司&#xff08;下称“深证信息”&#xff09;、泛欧交易所、北京新浪互联信息服务有限公司&#xff08;下称“新浪网”&#xff09;联合签署了合作备忘录&#xff0c;三方将基于各自优势在互联网大数据应用研究、股票指数开发、跨境指数产品…

【怎样写代码】小技巧 -- 关于方法中修饰形参的关键词

如果喜欢这里的内容&#xff0c;你能够给我最大的帮助就是转发&#xff0c;告诉你的朋友&#xff0c;鼓励他们一起来学习。 If you like the content here, you can give me the greatest help is forwarding, tell your friends, encourage them to learn together.

oracle schedule stop,Oracle调度Schedule特性(第八部分)-Windows和Window Groups

哈哈&#xff0c;关于schedule的内容还没完&#xff0c;本章讲Windows&#xff0c;通常说的Windows是指盖首富的操作系统&#xff0c;而此处所说的Windows&#xff0c;是指SCHEDULER特性中的一个子项。在SCHEDULER中&#xff0c;WINDOW对应的是一个时间窗口的概念。我们知道普通…

CSS入门-五个简单,但有用的CSS属性

今天说的这5个CSS属性,你可能会很熟悉,但是你可能会很少会去使用.这个教程所讲得不是关于CSS3的属性,而是依旧使用CSS2属性来说明,这些属性广泛的被各种浏览器所支持:clip,min-height,white-space,cursor和display.所以不要错过这个教程,因为你会发现他们是多么的有用.1.CSS Cl…

借助线下渠道逆袭?小米的愿望恐成镜花水月!

小米5的发布&#xff0c;让久未有波澜的中国手机市场又泛起几点涟漪。 而在小米5发布的同时&#xff0c;小米销售方式的改变&#xff0c;也让人眼前一亮。小米&#xff0c;已经由最初的“反传统”&#xff0c;开始向“传统”靠拢了。 小米5发布会上&#xff0c;小米告诉大家&am…

【怎样写代码】函数式编程 -- Lambda表达式(一):引出

如果喜欢这里的内容&#xff0c;你能够给我最大的帮助就是转发&#xff0c;告诉你的朋友&#xff0c;鼓励他们一起来学习。 If you like the content here, you can give me the greatest help is forwarding, tell your friends, encourage them to learn together.

oracle创建DBA角色命令,oracle常用DBA命令

1.查看用户拥有的数据库对象Sql代码select object_name from user_objects;2.查看约束信息Sql代码select constraint_name from user_constraints;3.查看用户所拥有的表Sql代码select table_name from user_tables;或Sql代码select *from tab;4.查看用户所拥有的视图Sql代码sel…

Ext JS Designer 1.0.5 发布

ExtJS官方Blog上发布了Ext JS Designer新版本&#xff0c;版本号为1.0.5&#xff0c;这个版本添加了不少新特性&#xff0c;如直接修改title&#xff0c;config参数搜索等等。虽然这个版本仍然不支持代码生成&#xff0c;不过另一则文章则让人感觉代码生成的日子也不远了。 此版…

【怎样写代码】函数式编程 -- Lambda表达式(二):C#常用委托

如果喜欢这里的内容&#xff0c;你能够给我最大的帮助就是转发&#xff0c;告诉你的朋友&#xff0c;鼓励他们一起来学习。 If you like the content here, you can give me the greatest help is forwarding, tell your friends, encourage them to learn together.

前端设计(一)

前端设计&#xff08;一&#xff09;

oracle time格式化比较,ORACLE DATE和TIMESTAMP数据类型的比较(二) (转)

ORACLE DATE和TIMESTAMP数据类型的比较(二) (转)[more]原著作者&#xff1a;James KmannTIMESTAMP数据的格式化显示和DATE 数据一样。注意&#xff0c;to_char支持date和timestamp&#xff0c;但是trunc却不支持TIMESTAMP数据类型。这已经清楚表明了在当两个时间的差别极度重要…

模式实例之——外观实例

场景&#xff1a;银行柜员机取钱或存钱描述&#xff1a;从银行的柜员机取了100块钱&#xff08;一&#xff09;子系统/// <summary>/// 子系统抽象/// </summary>public interface IDo{void ShowMessage(string strMemo);}&#xff08;二&#xff09;各个子系统///…

cnpm install -g generator-gulp-webapp yo gulp-webapp test-gulp-webapp

2019独角兽企业重金招聘Python工程师标准>>> cnpm install -g generator-gulp-webapp yo gulp-webapp test-gulp-webapp 转载于:https://my.oschina.net/yizhichao/blog/1189216

【怎样写代码】函数式编程 -- Lambda表达式(三):LINQ初步

如果喜欢这里的内容&#xff0c;你能够给我最大的帮助就是转发&#xff0c;告诉你的朋友&#xff0c;鼓励他们一起来学习。 If you like the content here, you can give me the greatest help is forwarding, tell your friends, encourage them to learn together.

oracle触发器初始化,oracle – 触发器无法初始化变量

我有触发审计,它存储了对任何EMP表行执行的操作.这个触发器工作正常,除了在某些情况下(很少发生,我无法确定确切的条件)它给了我Oracle错误&#xff1a;ORA-01400&#xff1a;无法插入NULL(“MY_SCHEMA”.“HIST_EMP”.“操作”)CREATE OR REPLACE TRIGGER HIST_EMP_AIUDAFTER …

翻页导航条页码计算方法

在开发搜索引擎等应用时&#xff0c;提供一个翻页导航条是必须的。我看过网上一些相关的代码&#xff0c;搞得很复杂。晕~~~ 其实其数学计算公式非常简单&#xff0c;本文提供两种最常用的算法。翻页式样式如下。每次显示10个页码&#xff0c;并提供"前十"、"后…

ArcGIS水文分析实战教程(9)雨量计算与流量统计

ArcGIS水文分析实战教程&#xff08;9&#xff09;雨量计算与流量统计 本章导读&#xff1a;降水是水文循环中重要的一环&#xff0c;降水包括雨、雪、雾、露、雹等&#xff0c;本章介绍的是降雨的环节。通过雨量站与插值的方式&#xff0c;实现雨量的空间分布就算&#xff0c;…

【怎样写代码】函数式编程 -- Lambda表达式(四):Lambda表达式与Expression树

如果喜欢这里的内容&#xff0c;你能够给我最大的帮助就是转发&#xff0c;告诉你的朋友&#xff0c;鼓励他们一起来学习。 If you like the content here, you can give me the greatest help is forwarding, tell your friends, encourage them to learn together.

matlab svr 预测,SVR 多目标预测

程序代码&#xff1a;close all;clear;clc;format compact;load i_source.mat;% 提取数据[m,n] size(B);ts B(1:180,1);tsx B(1:180,2:n);figure;plot(ts,LineWidth,2);title(点信源波达方向随时间的变化规律,FontSize,12);xlabel(时间,FontSize,12);ylabel(波达方向,FontSi…

【建模必备】遗传算法的定义与生物学基础

如果喜欢这里的内容&#xff0c;你能够给我最大的帮助就是转发&#xff0c;告诉你的朋友&#xff0c;鼓励他们一起来学习。 If you like the content here, you can give me the greatest help is forwarding, tell your friends, encourage them to learn together.

转_前端开发技术概要

原文&#xff1a;http://www.2008sc.cn/blog/article.asp?id82 1、JavaScript 中的内存泄露模式http://www.ibm.com/developerworks/cn/web/wa-memleak/index.html----------------------2、javascript中的 闭包http://www.felixwoo.com/archives/247http://www.cn-cuckoo.com…

python中的类的成员变量以及property函数

1 python类的各种变量 1.1 全局变量 在类外定义的变量。 1.2 类变量 定义在类里面&#xff0c;所有的函数外面的变量。这个变量只有一份&#xff0c;是所有的对象共有的。在类外用“类.”来引用。 1.3 实例变量 用self.xxx在类的任何函数中定义的变量就是实例变量。在类内用“s…

php http面向对象编程实例,PHP面向对象编程——PHP对象引用实例代码

/*?* WEB开发笔记 www.chhua.com 每日练习 PHP面向对象编程——PHP对象引用实例代码?*//*代码演示?* */class HelloWorld {//被引用对象?public $world;?function __construct($world){??$this->world$world;?}??function getHtml(){??????? return “Hell…

一个简单的提示效果

一个简单的效果&#xff0c;修改了三次才能达到如意的效果。看来&#xff0c;细节真的是决定成败。 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns&q…

Java中使用FTPClient上传下载

转自:http://blog.csdn.net/hbcui1984/article/details/2720204 在JAVA程序中&#xff0c;经常需要和FTP打交道&#xff0c;比如向FTP服务器上传文件、下载文件&#xff0c;本文简单介绍如何利用jakarta commons中的FTPClient&#xff08;在commons-net包中&#xff09;实现上传…

【建模必备】遗传算法的基本原理与步骤(编码/解码)

如果喜欢这里的内容&#xff0c;你能够给我最大的帮助就是转发&#xff0c;告诉你的朋友&#xff0c;鼓励他们一起来学习。 If you like the content here, you can give me the greatest help is forwarding, tell your friends, encourage them to learn together.