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

最近在一个项目中需要用到无限分类的平铺多选,单选这些功能,查了一些资料,结果大都是一些用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人要

你可能感兴趣的:(控件)