实现CheckBox的三种选中状态(全选、半选、不选)在GridView中模拟树形的功能

度娘了很多帖子,只说三种状态要用图片替换来做,但没找到有用的例子,被逼自己写了一个

三方控件肯定是很多的,如jstree,可以直接用

由于公司的UDS限制,不能上传图片,只能文字说明了。

就是要在gridview中实现如下效果:一级、二级因为三级没有全部选中而显示半选状态

?一级
   ?二级
      三级1
       三级2

js↓

$(function(){
        BindCheckNode();
        $("span[name^=‘lblCheck‘]").click(checkBoxClick);
     });

function checkBoxClick()
     {
        var isChecked = $(this).attr("class") == "default" ? "checked"  : "default";
        $(this).attr("class",isChecked);
        //同步checkbox
        $(this).next().children().eq(0).attr("checked",isChecked!="default");
        var trNode = $(this).parent().parent();

        childChange(trNode,isChecked);
        parentChange(trNode,isChecked);
     }

//数据绑定时,对选中状态的节点做变更,如果有一个子节点没有选中,则为半选中状态
       function BindCheckNode()
       {
           //判断选中状态的节点的子节点是否全部选中,
           $("span[name^=‘lblCheck‘]").each(function(){
                if($(this).attr("class")=="checked")
                {
                    var curNode = this.parentNode.parentNode;
                    if(!CheckAll(curNode))
                    {
                        $(this).attr("class","checkHalf");
                    }
                }
            });
       }    

       //选中状态判断
       function CheckAll(curNode)
       {
         var level = parseInt($(curNode).attr("level"));
         var id = $(curNode).attr("id");
         var nextNode = $(curNode).next();
         while (nextNode != null && parseInt($(nextNode).attr("level")) > level) {
            //每个节点都要循环它的所有子节点,判断是否选择
             var nextCheck=$(nextNode).children().eq(0).children("span").eq(1);
             if ($(nextCheck).attr("class") == "default") {
                 return false;
             }
             nextNode = $(nextNode).next();
         }
         return true;
     }

     //checkbox点击后影响子节点
     function childChange(curNode,className)
     {
        var level = parseInt($(curNode).attr("level"));
        var nextNode = $(curNode).next();

        //循环子节点
        while(nextNode!=null && parseInt($(nextNode).attr("level") ) > level)
        {
            var nextCheck=$(nextNode).children().eq(0).children("span:eq(1)");
            $(nextCheck).attr("class",className);
            $(nextCheck).next().children().eq(0).attr("checked",className!="default");
            nextNode=$(nextNode).next();
        }
     }

     //checkbox点击后影响父节点
     function parentChange(curNode, className)
     {
        var pid = $(curNode).attr("pid");
        var parentNode = $("#"+pid);
        if(!$(parentNode).attr("pid"))
            return false;

        var parentSpanCheck=$(parentNode).children().eq(0).children("span").eq(1);
        var childList = $("tr[pid=‘"+pid+"‘]");
        var flag = false;
        var tempNode;
        $.each(childList, function(i,item){
            tempNode = $(item).children().eq(0).children("span").eq(1);
            if($(tempNode).attr("class") != className)
           {
                flag = true;
                return;
           }
        });
        if(flag)
        {
            $(parentSpanCheck).attr("class", "checkHalf");
        }
        else if(!flag && className == "checked")
        {
             $(parentSpanCheck).attr("class", "checked");
        }
        else
        {
             $(parentSpanCheck).attr("class", "default");
        }
        var parentSpanCheckClass=$(parentSpanCheck).attr("class");
        $(parentSpanCheck).next().children().eq(0).attr("checked",parentSpanCheckClass!="default");
        if(pid != "0")
            changeParentState(parentNode, className);
     }

css↓  主要是背景图的移动,图片排列方式为 [全选][未选][半选]

 <style type="text/css">
        .checked {background-position-x: 0px;}
        .checkHalf{background-position-x: 23px;}
        .default{background-position-x: 46px;}
    </style>

C#前台 ↓  已将多余的东西删掉,gridview中只有一列,跟上面的table相似,lbl_Space用来增加缩进的,保留原始的checkbox,因为在保存的时候需要遍历整个gridview,不管是后台还是js中修改span的class属性,遍历gridview的时候是获取不到的

<asp:GridView ID="dgResource" OnRowDataBound="dgResource_RowDataBound" DataKeyNames="ResourceID" runat="server" AutoGenerateColumns="False">
                        <Columns>

                            <asp:TemplateField>
                                <HeaderStyle Wrap="False"></HeaderStyle>
                                <ItemStyle Wrap="False"></ItemStyle>
                                <ItemTemplate>
                                    <asp:Label runat="server" ID="lbl_Space" ForeColor="#f5fbff" Text=‘<%# GetSpaceNameFromLevel(DataBinder.Eval(Container, "DataItem.NameValues[Level]").ToString()) %>‘>
                                    </asp:Label>
                                    <span id="lblCheck" name="lblCheck" runat="server" class="default" style="width: 23px;
                                        height: 25px; background-image: url(../../Common/Images/Icons/checkboxButton.jpg);">
                                    </span>
                                   <div style="display:none;">
                                    <asp:CheckBox runat="server" ID="chk_Query"></asp:CheckBox>
                                   </div>
                                    <asp:Label runat="server" Text=‘<%# DataBinder.Eval(Container, "DataItem.ResourceName") %>‘></asp:Label>
                                    <asp:HiddenField ID="hfdPID" runat="server" Value=‘<%# Eval("ParentResourceID") %>‘ />
                <asp:HiddenField ID="hfdLevel" runat="server" Value=‘<%# Eval("NameValues[Level]") %>‘ />
                                </ItemTemplate>
                            </asp:TemplateField>
                        </Columns>
                    </asp:GridView>

.net ↓

protected void dgResource_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                string id = ParamUtil.getstring(dgResource.DataKeys[e.Row.RowIndex]["ResourceID"]);
                string pid = (e.Row.FindControl("hfdPID") as HiddenField).Value;
                string level = (e.Row.FindControl("hfdLevel") as HiddenField).Value;
                string application = (e.Row.FindControl("hfdApplication") as HiddenField).Value;
                //增加节点的属性
                e.Row.Attributes.Add("id", id);
                e.Row.Attributes.Add("pid", pid);
                e.Row.Attributes.Add("level", level);
        }
}

//点击保存时
for (int i = 0; i < dgResource.Rows.Count; i++)
{
    CheckBox chkQuery = (CheckBox)dgResource.Rows[i].FindControl("chk_Query");
    //根据chkQuery的Checked即可获取是否选中,注:半选也算选中
}

时间: 2024-12-21 13:57:24

实现CheckBox的三种选中状态(全选、半选、不选)在GridView中模拟树形的功能的相关文章

c# TreeView实现三种选中状态

c# 项目中需要实现树状选项的勾选,有全选,半勾选,不选的状态. 因原控件中只有勾选和不勾选两种状态,所以半勾选状态需要使用代码绘制和自行定义. 勾选:Node.Checked=true 不勾选: Node.Checked=false 半勾选: Node.Checked=false && Node.ToolTipText="部分勾选" 注意:半勾选状态需要重新绘制控件需要设置控件属性DrawMode为OwnerDrawText或者OwnerDrawAll 核心逻辑一:设

进程三种基本状态

进程的三种基本状态: (1)       就绪状态:进程已获得除CPU外的所有必要资源,只等待CPU时的状态.一个系统会将多个处于就绪状态的进程排成一个就绪队列. (2)       执行状态:进程已获CPU,正在执行.单处理机系统中,处于执行状态的进程只一个:多处理机系统中,有多个处于执行状态的进程. (3)       阻塞状态:正在执行的进程由于某种原因而暂时无法继续执行,便放弃处理机而处于暂停状态,即进程执行受阻.(这种状态又称等待状态或封锁状态) 通常导致进程阻塞的典型事件有:请求I/

酷毙了!三种风格的全屏幻灯片效果【附源码下载】

今天,我们想向您展示如何创建平铺背景图像的幻灯片效果.其灵感来自于国外的一个工作室网站(围观),这个网站充满了各种有趣和创意效果,一定记得去看看. 这个幻灯片效果是由四个区域的独立移动构成,通过画面分割,同时显示出新的图片.这里需要组合使用 CSS3 的3D转换.过渡和动画功能.除了这种效果我们也将添加两个更多的变化,我们的宗旨是实现超流畅的交互体验. 温馨提示:为保证最佳的效果,请在 IE10+.Chrome.Firefox 和 Safari 等现代浏览器中浏览. 源码下载      在线演示

持久化类的三种实例状态

一个持久化类的实例可能处于三种不同状态中的某一种.这三种状态的定义则与所谓的持久化上下文(persistence context)有关.hibernate的session对象就是这个所谓的持久化上下文. 瞬态:该实例从未与任何持久化上下文关联过.它没有持久化标识(相当于主键值). 持久化:实例目前与某个持久化上下文有关联.它拥有持久化标识(相当于主键值),并且可能在数据库中有一个对应的行.对于某一个特定的持久化上下文,hiberanate保证持久化标识与java标识(其值代表对象在内存中的位置)

hibernate的三种对象状态

1  上一个 project 2 三种状态的区分关键在于 a)有没有ID b)ID在数据库中有没有 c)在内存中有没有(session缓存) 3 三种状态: a)transient:内存中一个对象,没ID,缓存中也没有 b)persistent:内存中有,缓存中有,数据库有(ID) c)detached:内存有,缓存没有,数据库有,ID 4 对这三种状态需要关注的问题是在该状态下如果进行数据库的操作会发生什么结果,比 如改变属性的值会不会发出update语句?

模拟操作系统中进程的三种基础状态与内存的分配和回收(最佳适配算法)

利用键盘模拟进程的三种操作状态,并且使用C++中的list模板模拟内存的分配和回收. 能够模拟进程的创建与撤销过程 l可对进程的状态进行全面的控制 按先进先出方式管理就绪和阻塞队列,能够按队列形式输出进程状 用PCB代表进程,用全局变量表示进程的个数. 1 #include <iostream> 2 #include <list> 3 #include <numeric> 4 #include <algorithm> 5 #include<stdlib

Git中三种文件状态及其转换

Git作为一种版本控制解决方案,由于其具有的分布式特性,正被越来越多的用户熟知,一些有名的开源项目,如:Linux kernel,CakePHP,Ruby on Rails等,都在使用Git进行版本管理. 在Git中,文件状态是一个非常重要的概念,不同的状态对应不同的操作.因此,要想熟练掌握Git的用法,需要了解Git的几种文件状态. 为了说明的方便,现在初始化一个项目,也就是将项目所在目录纳入Git的管理之下.假设项目目录为hello_world,初始化之后,在目录下新建README.txt文

【Android高级】XMl文件的DOM、SAX、PULL三种解析方式全解

本来一直忙着期末考试的复习,但复习挺无聊的,偶然看到xml的解析方法,虽然以前做过,但感觉不是很熟悉了,所以抽点时间一口气把三种方式都复习了遍.这三种方法中DOM最耗内存,因为它是把整个文件加载进去然后进行分类整理的,PULL和SAX类似,只是SAX要用到一个解析类,类中的主要三个方法完成内容的解析,而PULL方法是Android特有的,根据获得的标签判断并解析,这也是安卓中最常使用的方法. 接下来给大家复习下,因为我觉得看代码更容易明白,讲解的就不多了. 首先我们准备好我们要解析的资源文件和封

checkbox,三种状态设置

选中.未选中.半选中(常用于子项有选中,未全选) <input id="ckeckbox" type="checkbox"> $('#checkbox').prop("checked",true); $('#checkbox').prop("checked",false); $("#checkbox").prop("indeterminate", true); $("