Treeview 父子节点选中的级联操作
选中父节点,同时选中子节点。 选中子节点,自动勾选上父节点,当所有的子节点都没有选中的时候,又自动取消父节点的勾选。

<script src="http://www.cnblogs.com/js/jquery-1.4.2.js" type="text/javascript"></script>
<script language="javascript" type="text/javascript">
$(document).ready(Bind);
function Bind() {
BindTreeView("tvMenu", true, true);
}
function BindTreeView(treeViewId,selectChild,selectParent) {
$("#" + treeViewId + " input").click(function() {
if (selectChild) {
var divItem = $(this).parent().parent().parent().parent().next();
if (divItem[0] != null){ // 屏蔽选最后一个时,会弹出错误的漏洞
if (divItem[0].tagName == "DIV")
divItem.find("input").attr("checked", $(this).get(0).checked);
}
}
if (selectParent) {
SelectParentNode(treeViewId, $(this));
}
});
}
function SelectParentNode(treeViewId,node) {
if (node.get(0) != null ){
if (node.get(0).checked == true) {
var pdiv = node.parent().parent().parent().parent().parent();
if (pdiv.get(0).id != treeViewId) {
pdiv.prev().find("input").attr("checked", node.get(0).checked);
SelectParentNode(treeViewId, pdiv.prev().find("input"));
}
} else { // 取消所有子的选择,父节点也取消
var pdiv = node.parent().parent().parent().parent().parent();
if (pdiv.get(0).id != treeViewId) {
var divItem = node.parent().parent().parent().parent().parent();
if (divItem[0] != null) {
if (divItem[0].tagName == "DIV") {
if (divItem.find("input[type='checkbox']:checked").size() == 0 ) {
pdiv.prev().find("input").attr("checked", false);
}
}
}
SelectParentNode(treeViewId, pdiv.prev().find("input"));
}
}
}
}
</script>
<script language="javascript" type="text/javascript">
$(document).ready(Bind);
function Bind() {
BindTreeView("tvMenu", true, true);
}
function BindTreeView(treeViewId,selectChild,selectParent) {
$("#" + treeViewId + " input").click(function() {
if (selectChild) {
var divItem = $(this).parent().parent().parent().parent().next();
if (divItem[0] != null){ // 屏蔽选最后一个时,会弹出错误的漏洞
if (divItem[0].tagName == "DIV")
divItem.find("input").attr("checked", $(this).get(0).checked);
}
}
if (selectParent) {
SelectParentNode(treeViewId, $(this));
}
});
}
function SelectParentNode(treeViewId,node) {
if (node.get(0) != null ){
if (node.get(0).checked == true) {
var pdiv = node.parent().parent().parent().parent().parent();
if (pdiv.get(0).id != treeViewId) {
pdiv.prev().find("input").attr("checked", node.get(0).checked);
SelectParentNode(treeViewId, pdiv.prev().find("input"));
}
} else { // 取消所有子的选择,父节点也取消
var pdiv = node.parent().parent().parent().parent().parent();
if (pdiv.get(0).id != treeViewId) {
var divItem = node.parent().parent().parent().parent().parent();
if (divItem[0] != null) {
if (divItem[0].tagName == "DIV") {
if (divItem.find("input[type='checkbox']:checked").size() == 0 ) {
pdiv.prev().find("input").attr("checked", false);
}
}
}
SelectParentNode(treeViewId, pdiv.prev().find("input"));
}
}
}
}
</script>
走向地狱的途中,不小心走了程序员这条路,路上一个个黑心的老板,和暗无天日的加班,我才发现,通往地狱的路径中,我们这行是最短的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义