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

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

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

代码如下:

控件behind代码CS:

 

MultiSelectItems.ascx.cs

 

html代码很简单:

 

MultiSelectItems.ascx

 

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

 

MultiSelectItems.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人要

posted @ 2009-12-01 16:06  活跃的毛虫  阅读(513)  评论(0编辑  收藏  举报