ASP.NET Treeview控件中对Checkbox的联级选择

ASP.NET的TreeView  <br />树是组织信息的强有力工具,软件开发人员手中一定要有一棵称手的“树”。这篇文章以VS2008为例讨论ASP.NET提供的树控件“TreeView”,看看它是否足够强大,能否满足商业应用。1        首次使用遇到的问题<br />很简单的,我在页面(WebForm)中添加一个“TreeView”,然后在设计视图里添加了几个静态节点,出于美观的需要,我想把节点用线连接起来,微软果然厚道,通过“自定义行图标”直接设置“LineStyle”为“Solid”,搞定!下面是显示效果:<br /><br 阅读详情
/**************************************************************************
   ASP.NET 2.0 TreeView控件 客户端CheckBox Chanage事件,兼容IE,OPERA,FIREFOX
 1. 每勾选一个节点就要遍历勾选它的所有子节点         setChildChecked
    同时循环勾选父节点                                                     setParentChecked

2. 每取消勾选一个节点就要遍历取消它的所有子节点  setChildUnChecked
    如果同级其他的节点都未勾选,则循环取消父节点     setParentUnChecked

   CheckBox的ID形如:TreeView1n1CheckBox
   树ID+'n'+编号+'CheckBox' 编号从0开始, 
   它的所有子节点都会在ID为TreeView1n1Nodes的Div中.
**************************************************************************/

//TreeView onclick触发事件
function client_OnTreeNodeChecked(event)
{
    //得到当前所Click的对象
    var objNode;
    if(!public_IsObjectNull(event.srcElement))
    {
        //IE
        objNode = event.srcElement;
    }
    else
    {
        //FF
        objNode = event.target;
    }

    //判断是否Click的CheckBox
    if(!public_IsCheckBox(objNode))
        return;

    var objCheckBox = objNode;
    //根据CheckBox状态进行相应处理
    if(objCheckBox.checked==true)
    {
        //递归选中父节点的CheckBox
        setParentChecked(objCheckBox);
        
        //递归选中所有的子节点
        setChildChecked(objCheckBox);
    }
    else
    {        
        //递归取消选中所有的子节点
        setChildUnChecked(objCheckBox);
        
        //递归取消选中父节点(如果当前节点的所有其他同级节点也都未被选中).
        setParentUnChecked(objCheckBox);
    }
}

//判断对象是否为空
function public_IsObjectNull(element)
{
    if(element==null || element == "undefined")
        return true;
    else
        return false;
}

//判断对象是否为CheckBox
function public_IsCheckBox(element)
{
    if(public_IsObjectNull(element))
        return false;
        
    if(element.tagName!="INPUT" || element.type!="checkbox")
        return false;
    else
        return true;
}
//得到包含所有子节点的Node(Div对象)
function public_CheckBox2Node(element)
{
    var objID = element.getAttribute("ID");
    objID = objID.substring(0,objID.indexOf("CheckBox")); 
    return document.getElementById(objID+"Nodes");
}
//得到父节点的CheckBox
function public_Node2CheckBox(element)
{
    var objID = element.getAttribute("ID");
    objID = objID.substring(0,objID.indexOf("Nodes")); 
    return document.getElementById(objID+"CheckBox");
}
//得到本节点所在的Node(Div对象)
function public_GetParentNode(element) 
{
    var parent = element.parentNode;
    var upperTagName = "DIV";
    //如果这个元素还不是想要的tag就继续上溯
    while (parent && (parent.tagName.toUpperCase() != upperTagName)) 
    {
        parent = parent.parentNode ? parent.parentNode : parent.parentElement;
    }
    return parent;
}


//设置节点的父节点Checked
function setParentChecked(currCheckBox)
{ 
    var objParentNode= public_GetParentNode(currCheckBox);
    if(public_IsObjectNull(objParentNode))
        return;    
    
    var objParentCheckBox = public_Node2CheckBox(objParentNode);

    if(!public_IsCheckBox(objParentCheckBox))
        return; 
        
    objParentCheckBox.checked = true;
    setParentChecked(objParentCheckBox);
}

//当父节点的所有子节点都未被选中时,设置父节点UnChecked
function setParentUnChecked(currCheckBox)
{
    var objParentNode= public_GetParentNode(currCheckBox);
    if(public_IsObjectNull(objParentNode))
        return;   
    //判断currCheckBox的同级节点是否都为UnChecked.
    if(!IsMyChildCheckBoxsUnChecked(objParentNode))
        return;    
    
    var objParentCheckBox = public_Node2CheckBox(objParentNode);

    if(!public_IsCheckBox(objParentCheckBox))
        return; 
        
    objParentCheckBox.checked = false;    
    setParentUnChecked(objParentCheckBox);
}

//设置节点的子节点UnChecked
function setChildUnChecked(currObj)
{
    var currNode;
    if(public_IsCheckBox(currObj))
    {
        currNode = public_CheckBox2Node(currObj);
        if (public_IsObjectNull(currNode))
            return;
    }
    else
        currNode = currObj;
       
    var currNodeChilds = currNode.childNodes;
    var count = currNodeChilds.length; 
    for(var i=0;i<count;i++)
    {
        var childCheckBox = currNodeChilds[i];
        if(public_IsCheckBox(childCheckBox))
        {
            childCheckBox.checked = false;
        }
        setChildUnChecked(childCheckBox); 
    }
}

//设置节点的子节点Checked
function setChildChecked(currObj)
{ 
    var currNode;
    if(public_IsCheckBox(currObj))
    {
        currNode = public_CheckBox2Node(currObj);
        if (public_IsObjectNull(currNode))
            return;
    }
    else
        currNode = currObj;
        
    var currNodeChilds = currNode.childNodes;
    var count = currNodeChilds.length; 
    for(var i=0;i<count;i++)
    {
        var childCheckBox = currNodeChilds[i];
        if(public_IsCheckBox(childCheckBox))
        {
            childCheckBox.checked = true;
        }
        setChildChecked(childCheckBox); 
    }
}

//判断该节点的子节点是否都为UnChecked
function IsMyChildCheckBoxsUnChecked(currObj)
{
    var retVal = true;
    
    var currNode;
    if(public_IsCheckBox(currObj) && currObj.checked == true)
    {
        return false;
    }
    else
        currNode = currObj;
       
    var currNodeChilds = currNode.childNodes;
    var count = currNodeChilds.length; 
    for(var i=0;i<count;i++)
    {
        if (retVal == false)
            break;
        var childCheckBox = currNodeChilds[i];
        if(public_IsCheckBox(childCheckBox) && childCheckBox.checked == true)
        {
            retVal = false;
            return retVal;
        }
        else
            retVal = IsMyChildCheckBoxsUnChecked1(childCheckBox);         
    }
    return retVal;
}


 

 

----------------------------

后台

 tvProj.Attributes.Add("onclick", "client_OnTreeNodeChecked(event)");

 

 

=============================================

Asp.Net选择TreeView前面的复选框引起回发
记得以前写过一个代码。需要在TreeView前面的复选框选中时触发后台事件,从而引起页面其他部分数据发生改变。
当时记得好像TreeView前面的复选框的可以引发选中项改变事件,而在某项由选中变成不选中,或者由不选中变成选中时是不能触发后台事件的。
下面把它记下来,希望以后再用到时会有所帮助
1.在页面上需要设置TreeView父项和子项的、
    Checked="True" 和ShowCheckBox="True"
2.在绑定TreeVeiw时,给它添加onclick事件代码如下
  TreeView1.Attributes.Add("onclick", "postBackByObject()");//添加点击事件
注:postBackByObject是一个JavaScript函数具体代码如下
  // 点击复选框时触发事件(此事件会引起回发)
  function postBackByObject()
  {
     var o = window.event.srcElement;
     if (o.tagName == "INPUT" && o.type == "checkbox")
     {
         __doPostBack("UpdatePanel1","");  //此处前面是两个下划线(UpdatePanel1处是因为用了UpdatePanel所以才写这个控件ID的)
     } 
  }
3.postBackByObject函数引发的回传最终是触发TreeNodeCheckChanged事件的。下面只贴代码。
    /// <summary>
    /// 左边树形控件选择项改变
    /// 判断是否选择,加入右边控件
    /// </summary>
    protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e)
    {
        TreeNode node = TreeView1.SelectedNode;
        if (node != null && node.Parent != null) //选中节点不为空,非父节点。
        {
           //添加或移除项
        }
        else    //点击的是复选框
        {
            if (node.ChildNodes.Count > 0)   //选中的是父节点的框
            {
                SetChildChecked(node);    //复选框事件
            }
            else        //选中的是子节点
            {
                 //添加或移除项
            }
        }
    }
    /// <summary>
    /// 左边树形控件选择项改变
    /// 判断是否选择,加入右边控件
    /// </summary>
    protected void TreeView1_TreeNodeCheckChanged(object sender, TreeNodeEventArgs e)
    {
        SetChildChecked(e.Node);
        // 判断是否是根节点
        if (e.Node.Parent != null)
        {
            e.Node.Parent.Checked = e.Node.Checked;
            AddSourceTable(e.Node);
        }
     }
    /// <summary>
    /// 根据父节点状态设置子节点的状态
    /// </summary>
    /// <param name="parentNode"></param>
    private void SetChildChecked(TreeNode parentNode)
    {
        foreach (TreeNode node in parentNode.ChildNodes)
        {
            node.Checked = parentNode.Checked;
            ..........         //添加或移除项
            if (node.ChildNodes.Count > 0)
            {
                SetChildChecked(node);
            }
        }
    } 



 

Asp.Net TreeView控件的Checkbox集成及联动功能实现 ASP.NET TreeView控件是用于以树状结构展示层级数据的强大UI组件。它允许开发者以声明性和编程性方式创建复杂的层级视图,非常适合于显示具有父子关系的信息,比如文件系统结构、组织架构或任何需要清晰层次展示的数据集合。为了提升用户体验,开发者可以对TreeView控件中的TreeNode对象进行样式自定义。这包括但不限于字体样式、背景颜色、边框样式等。下面是一个使用 CSS 为 TreeNode 自定义样式的示例:/* CSS样式定义 */ 阅读详情

相关推荐

Asp.Net TreeView Checkbox

Asp.Net Checkbox操作及父子级Checkbox联动Demo

解决asp.net 2.0 中treeview的checkbox级联选择

以下代码实现了当TreeView节点包含CheckBox时保持其父子节点状态一致,即:当选中父节点,子节点会全部自动选上,反之则全部取消。选择某个子节点,同样应该选中这个字节点的父节点(包括祖先节点)。 在网上也找了一些方法,但是我觉得这是TreeView的一个缺陷,因此应该在该控件内部实现,而不应该附加一些外部的js来控制TreeView,有什么问题可以给我留言,我及时更正: ...

aiyinzhi8916的博客 194

asp简单的select级联菜单带数据库

asp简单的select级联菜单带数据库

Asp.net2.0里Treeview的复选框级联操作

       最近也没有多少事做,自己在业余的时间研究了一下Treeview的使用方法,试着做一个功能树的东东。        刚开始做的时候可遇到了不少麻烦,并不是自己想象的那么简单,Treeview一点也不听使唤。        1.根节点在包含子结点的时候根本不需要跳转页面,点击跟结点名称的时候需要它执行的是展开和折叠子结点。        通过大量的网上查找资料和VS的帮助总算找到了...

weixin_34290631的博客 178

速腾RS-LiDAR-16激光雷达ROS环境搭建与点云可视化实战指南

本文提供速腾RS-LiDAR-16激光雷达在ROS环境下的完整搭建与可视化实战指南。从硬件连接、网络配置、驱动安装编译,到核心参数详解与Rviz点云可视化,手把手解决IP设置、坐标系对齐等常见问题,帮助开发者快速实现激光雷达三维点云数据的采集与显示。

weixin_29271263的博客 369

unity C# 计算3D空间任意多边形面积,距离,角度测量工具

unity C# 计算3D空间任意多边形面积,距离,角度 using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEngine.UI; using System; /// /// 划线面积,距离,角度 /// public class UnderlinedMeasureTool : MonoBehaviour { /// /// 相机 /// public Camera _c

qq_22972867的博客 2224

ASP.NET TreeView级联选择问题

  ASP.NET TreeView级联选择问题关于ASP.NET TreeView控件级联选择问题,网上有不少的解决办法。个人觉得给TreeView注册onclick事件是最好的办法。下面是用于级联选择的一个JavaScript方法,将此方法注册到TreeView的onclick即可实现级联选择:    function CheckSubNodes()    {       

姚建友的专栏 2711

csp-j/s

CSP-J/S 是中国计算机学会(CCF)主办的 ‌‌(Certified Software Professional Junior/Senior),是信息学奥赛(NOI)体系的入门级选拔考试,也是国内最具权威性的青少年编程能力认证之一。

gxyxxrYYDS的博客 2028

asp.net treeview 级联选择

<script type="text/javascript"> //当前table的父table所在的checkbox function GetParentCheckBox(node) { while (node.tagName != "TABLE") { node = no...

weixin_33862041的博客 163

论文阅读:SuperGaussians: Enhancing Gaussian Splatting Using Primitives with Spatially Varying Colors

Gaussian Splattings 在基于高斯显式表示的多视图重建中展示出了令人印象深刻的结果。然而,当前的高斯基元只有单视图依赖的颜色和不透明度来表示场景的外观和几何形状,导致了一种非紧凑的表示。在本文中,我们引入了一种名为“超高斯(SuperGaussians)”的新方法,它在单个高斯基元中利用空间变化的颜色和不透明度来提高其表示能力。我们实现了双线性插值、移动核,甚至是小型神经网络作为空间变化函数。

m0_48319749的博客 1508

Cadence SIP Layout 简单教程-第二章

[从whp1920 网易博客迁移至优快云] 第一章在正式布线之前做了必须做的准备工作,下面进入正题,打开Candence SIP RF Layout GXL软件。 第一节 导入外形尺寸 打开SIP设置文件保存路径,如下图所示进入导入DXF页面,选中前一章时画好的外框图。打开导入界面后,再进入DXF In Edit/View Layers界面选择所有层,导入Class选择DRAWING FOR...

whp1920的博客 6939

ASP.NET 2.0中集联选择TreeView节点

大家会在ASP.NET 2.0使用TreeView控件时发现带有CheckBox控件的TreeNode对象(TreeView节点),选择CheckBox无法回发页面。在MSDN中对于TreeView.TreeNodeCheckChanged事件有一段备注:“当 TreeView 控件的复选框在两次向服务器发送之间更改状态时,会引发 TreeNodeCheckChanged 事件。这使您可以提供一个

Amanda的专栏 1099

企业数字化转型解决方案架构设计:一个五维全景视角

本文系统探讨了企业数字化转型的架构设计框架,提出五维协同模型:企业架构作为战略罗盘,业务架构聚焦价值创造,应用架构实现能力载体,数据架构提供智能燃料,技术架构奠定基础支撑。文章深入分析了各架构域的核心要素、设计原则及相互关系,并指出数字化转型需通过渐进路径,结合战略引领、技术赋能和组织变革,构建有机统一的架构体系。该框架为企业应对数字化复杂性提供了系统性方法论,强调从整体视角实现技术与业务的深度融合。

金牌架构师 1256

【项目】TreeView控件的CheckBox选中事件

Asp.net 2.0 中带有CheckBox的TreeView控件, 父节点CheckBox属性改了后如何修改其子节点的Check状态?   有两种方法:   一是PostBack回服务器端处理:   这种方法,每次PostBack都会刷新页面,同时展开收缩节点也会PostBack回去,刷新页面,用户体验很是不好。   首先在代码中注册属性: this.TreeView1.

杨晓敏 3600

【Envi风暴】Envi5.6安装图文教程(附Envi5.6完整版下载)

【Envi风暴】Envi5.6与应用商店app store安装图文教程(附Envi5.6完整版下载)从文末网盘下载完整的ENVI5.6安装包,如下所示:双击envi56-win.exe,开始安装。将f__x64下的两个补丁文件拷贝到安装路径。将f__x86下的两个补丁文件拷贝到安装路径。

智慧空间实验室 9197

MATLAB之把多个小cell拼成一个数组

问题描述 现有一个cell向量 L (90000,1),每个元素都是由一个(100X9)的double数组组成的.如图. 其中, 每个cell元素都是一个单独的数据, 我们要把它转换成(90000, 19, 100)的三维数组. cell2mat, 但是所有的数据会堆叠起来 L2=cell2mat(L); % (90000, 19) reshape, 变成三维数组 reshape的原理是从上到下, 从左往右拆开重组. 目前只有19这一维数据与要求一致, 那就以这个为突破口. L2=L2'; %

落日之城 9249

TreeView控件时发现带有CheckBox控件的TreeNode对象(TreeView节点),选择CheckBox无法回发页面

大家会在ASP.NET 2.0使用TreeView控件时发现带有CheckBox控件的TreeNode对象(TreeView节点),选择CheckBox无法回发页面。在MSDN中对于TreeView.TreeNodeCheckChanged事件有一段备注:“当 TreeView 控件的复选框在两次向服务器发送之间更改状态时,会引发 TreeNodeCheckChanged 事件。这使您可以提供一个

shoulangwangyue的专栏 876

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

VS2005 TreeView的checkBox的父子节点级联状态

  现在正在做一个小项目,用的是vs2005,要用到TreeView来管理一些分级数据,并能允许同时选中多个节点,因此需要用到TreeView的ShowCheckBox属性,当我用到的时候才发现,在选中复选框时并不会引起回发事件,这时我就犯愁了,该怎么办呢,从网上查了好多资料,发现有不少是用javascript来实现的TreeView的父子节点级联状态的,但是这些方法都不太适合VS2005的Tre

小铭专栏 1141

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

asp.net2.0的TreeView对checkbox的操作

大家会在ASP.NET 2.0使用TreeView控件时发现带有CheckBox控件的TreeNode对象(TreeView节点),选择CheckBox无法回发页面。在MSDN中对于TreeView.TreeNodeCheckChanged事件有一段备注:“当 TreeView 控件的复选框在两次向服务器发送之间更改状态时,会引发 TreeNodeCheckChanged 事件。这使您可以提供一个

I'm James 561

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

TreeView CheckBox 部分显示

用过asp.net的应该知道,要在treeview中实现上述功能可以使用ShowCheckBox 属性指定那些节点显示checkbox哪些不显示,可是winform中的treeview只提供一个ShowCheckBoxes 属性,要么全部节点显示checkbox,要不全部不显示,而指定节点没有ShowCheckBox 属性,下面就在winform的treeview中实现BS对应CheckBox 属

zhangkaiforex的专栏 5609

asp.net 2.0 中 TreeView控件中的checkbox客户端操作

 最近有一个项目要做到用树形结构来控制权限, 要做到以下三条 当选择根节点时所有的子节点都要被选择 当选择子节点时相应的根节点也要被选择 当所有子节点取消选择时根节点也要取消选择。   树形控件用的是asp.net 2.0自带的treeview控件,如何控制它的checkbox一点头绪也没有,google上找了找,发现这个问题还是比较普遍的,终于找了一

kyouken2007的专栏 796

Asp.Net 2.0 TreeView的Checkbox级联操作

1         前言<br />用.Net 做Web应用, 有一个很大的苦恼就是没有太趁手的TreeView可用。微软的TreeView仅用作数据显示还行,但服务器控件不停的刷新太影响客户体验。商业化的TreeView(obout treeview / FlyTreeView / Infragistics NetAdvantage Treeview)都不错,特别是obout treeview短小精干讨人喜欢,但许可证是一个大障碍(公司一般不会花钱买的)。我一般而言,在TreeView上做事情,用chec

mounting的专栏 475

Asp.Net TreeView 复选框选择

//TreeView onclick 触发事件 function client_OnTreeNodeChecked(event) { //得到当前所 Click 的对象 var objNode; if (!public_IsObjectNull(event.srcElement)) {

liwateryi的专栏 1858

遍历树,获取TreeView中CheckBox的值

<br />此范例是用于创建TreeView 中有CheckBox的树,获取CheckBox的选择值的,项目的代码是这样的:<br /> <br /> <br />JS部分: TreeCheckBox.js<br />————————————————————————————————————————————————————————<br /> function SelectCheckBox()<br />    {     <br />       var o = window.event.srcElemen

Roby sky 5412
上一篇: 20条编程经验
下一篇: Button的UseSubmitBehavior屬性
High_Mount
博客等级 码龄20年 49粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值