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

最近在一个项目中需要用到无限分类的平铺多选,单选这些功能,查了一些资料,结果大都是一些用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 @   活跃的毛虫  阅读(521)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示