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

三方控件肯定是很多的,如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 = ; i < dgResource.Rows.Count; i++)
{
CheckBox chkQuery = (CheckBox)dgResource.Rows[i].FindControl("chk_Query");
//根据chkQuery的Checked即可获取是否选中,注:半选也算选中
}

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

  1. EasyUI tree的三种选中状态

    EasyUI中tree有三种选中状态,分别是checked(选中).unchecked(未选中).indeterminate(部分选中). 其中indeterminate状态比较特殊,主要表示只有部分 ...

  2. [转]session缓存机制和三种对象状态

    摘自 http://blog.csdn.net/csh624366188/article/details/7612142 Hibernate 的Session就是其中的一个,它提供了基本的增,删,改, ...

  3. Hibernate中的三种数据状态

    Hibernate中的三种数据状态(临时.持久.游离) 1.临时态(瞬时态) 不存在于session中,也不存在于数据库中的数据,被称为临时态. 比如:刚刚使用new关键字创建出的对象. 2.持久态 ...

  4. 浅谈Hibernate中的三种数据状态

    Hibernate中的三种数据状态:临时.持久.游离 1.临时态(瞬时态) 不存在于session中,也不存在于数据库中的数据,被称为临时态. 数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器 ...

  5. 命令stat anaconda-ks.cfg会显示出文件的三种时间状态(已加粗):Access、Modify、Change。这三种时间的区别将在下面的touch命令中详细详解:

    7.stat命令 stat命令用于查看文件的具体存储信息和时间等信息,格式为"stat 文件名称". stat命令可以用于查看文件的存储信息和时间等信息,命令stat anacon ...

  6. checkbox的三种状态处理

    checkbox只有两种值:选中(checked)或未选中(unchecked).它可以有任何值,但是表单提交时checkbox的值只能是checked或unchecked.它的默认值是uncheck ...

  7. checkbox,三种状态设置

    多选按钮的  选中.未选中.半选中(常用于子项有选中,未全选) <input id="ckeckbox" type="checkbox"> $('# ...

  8. 【Hibernate框架】对象的三种持久化状态

    一.综述 hibernate中的对象有三种状态,分别是TransientObjects(瞬时对象).PersistentObjects(持久化对象)和DetachedObjects(托管对象也叫做离线 ...

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

    查看地址http://phplaber.iteye.com/blog/1699926

随机推荐

  1. ORA-12154:TNS:无法解析指定的连接标识符

    问题:ORA-12154:TNS:无法解析指定的连接标识符 原因:没有配置tnsnames.ora文件 解决方案: 配置环境变量变量名:ORACLE_HOME 变量值:如:D:\Database\pr ...

  2. Hibernate整合Spring异常'sessionFactory' or 'hibernateTemplate' is required

    今日在写GenericDao时,发现了一个异常,内容如下: org.springframework.beans.factory.BeanCreationException: Error creatin ...

  3. Linux驱动开发——pr_fmt的用法

    作者:彭东林 邮箱:pengdonglin137@163.com 在阅读kernel代码的时候,总是看到有很多驱动都在第一行定义pr_fmt,闲来没事,分析了一下, 发现,确实挺方便的.下面记录分享一 ...

  4. Storm介绍及与Spark Streaming对比

    Storm介绍 Storm是由Twitter开源的分布式.高容错的实时处理系统,它的出现令持续不断的流计算变得容易,弥补了Hadoop批处理所不能满足的实时要求.Storm常用于在实时分析.在线机器学 ...

  5. 【分布式】Zookeeper使用--Java API

    一.前言 上一篇博客我们通过命令行来操作Zookeper的客户端和服务端并进行相应的操作,这篇主要介绍如何通过API(JAVA)来操作Zookeeper. 二.开发环境配置 首先打开Zookeeper ...

  6. 你真的会玩SQL吗?你所不知道的 数据聚合

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  7. TFS工作项数据统计及相关数据库结构分析

    今天为客户的质量管理部门人员提供TFS咨询过程中,客户的质量管理专家基于TFS提出了一个比较棘手的数据统计需求.需求是这样,客户的数十个软件项目通过质量管理部按照年度版本计划进行软件产品系统的发布,因 ...

  8. 我是如何进行Spring MVC文档翻译项目的环境搭建、项目管理及自动化构建工作的

    感兴趣的同学可以关注这个翻译项目 . 我的博客原文 和 我的Github 前段时间翻译的Spring MVC官方文档完成了第一稿,相关的文章和仓库可以点击以下链接.这篇文章,主要是总结一下这个翻译项目 ...

  9. PostgreSQL介绍以及如何开发框架中使用PostgreSQL数据库

    最近准备下PostgreSQL数据库开发的相关知识,本文把总结的PPT内容通过博客记录分享,本随笔的主要内容是介绍PostgreSQL数据库的基础信息,以及如何在我们的开发框架中使用PostgreSQ ...

  10. VS资源编辑器常见错误RC1000到RC1208

    资源编译器错误RC1000到RC1208 以下主题包括资源编译器错误RC1000至RC1208: 资源编译器致命错误RC1000未知致命错误记下错误的情况下,尝试找出问题,并创建一个重现的测试案例,然 ...