dev treelist 常用用法小结

要求如下:

1:选择父节点后,子节点全部打钩;

2:选择子节点而不选择父节点,则从当前节点的父节点一直到根节点check框都是半选状态。

3:当子节点均未勾选时,设置父节点状态为:未选中状态

具体实现如下:

一、OptionView—ShowCheckBoxes属性为true,则每个节点前面自动增加一个check框。

二、设置OptionBehavior—AllIndeterminateCheckState属性为true,则check框可以出现半选状态。

具体代码显示如下:

  #region 点击节点前
        /// <summary>
        /// 点击节点前
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeList1_BeforeCheckNode(object sender, DevExpress.XtraTreeList.CheckNodeEventArgs e)
        {
            //MessageBox.Show("treeList1_BeforeCheckNode");
            e.State = (e.PrevState == CheckState.Checked ? CheckState.Unchecked : CheckState.Checked);
        }
        #endregion

        #region 点击节点后
        /// <summary>
        /// 点击节点后
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void treeList1_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)
        {
            if (e.Node == null)
            {
                return;
            }
            System.Data.DataRowView rov = treeList1.GetDataRecordByNode(e.Node) as System.Data.DataRowView;
            if (e.Node.CheckState == CheckState.Indeterminate)
            {
                e.Node.CheckState = CheckState.Checked;
            }
            if (e.Node.CheckState == CheckState.Checked)
            {
                if (e.Node.HasChildren)
                {
                    this.CheckNode(e.Node);
                }
                this.ValidParentIsChecked(e.Node);
            }
            else if (e.Node.CheckState == CheckState.Unchecked)
            {
                if (e.Node.HasChildren)
                {
                    this.SetCheckedChildNodes(e.Node, CheckState.Unchecked);
                }
                //从根节点往下 查询 是否有打钩的子节点,如果有那么 父节点的 半选状态不变否则变为 不选择状态
                this.ValidParentNodeIsCanleSel(e.Node);
            }
        }
        #endregion

        #region 节点操作集合
        /// <summary>
        /// 选择某个节点及其子节点
        /// </summary>
        /// <param name="node"></param>
        private void CheckNode(DevExpress.XtraTreeList.Nodes.TreeListNode node)
        {
            foreach (DevExpress.XtraTreeList.Nodes.TreeListNode cnode in node.Nodes)
            {
                if (cnode != null)
                {
                    cnode.CheckState = CheckState.Checked;
                }
                if (cnode.HasChildren)
                {
                    CheckNode(cnode);
                }
            }
        }

        /// <summary>
        /// 勾选子节点后,修改父节点的状态
        /// </summary>
        /// <param name="node"></param>
        private void ValidParentIsChecked(DevExpress.XtraTreeList.Nodes.TreeListNode node)
        {
            if (node.ParentNode != null)
            {
                if (node.ParentNode.CheckState == CheckState.Unchecked)
                {
                    node.ParentNode.CheckState = CheckState.Indeterminate;
                }
                else if (node.ParentNode.CheckState == CheckState.Indeterminate)
                {
                    if (!this.ValidIsHasCheckChildNode(node))//某节点下子节点均未被选中时,修改其状态
                    {
                        node.ParentNode.CheckState = CheckState.Unchecked;
                    }
                }
                this.ValidParentIsChecked(node.ParentNode);
            }
        }

        /// <summary>
        /// 从该节点往下 查询 是否有打钩的子节点,如果有那么 父节点的 半选、选中状态不变否则变为 不选择状态
        /// </summary>
        /// <param name="node"></param>
        private void ValidParentNodeIsCanleSel(DevExpress.XtraTreeList.Nodes.TreeListNode node)
        {
            bool isSel = false;
            if (node.ParentNode != null)
            {
                if (node.ParentNode.CheckState == CheckState.Indeterminate
                    || node.ParentNode.CheckState == CheckState.Checked)
                {
                    //如果父节点的 状态为 半选 状态 这 根据父节点 判断子节点是否打钩
                    isSel = ValidIsHasCheckChildNode(node.ParentNode);
                    if (isSel == false)
                    {
                        //如果所有的 子节点 都没有 “选中”那么 父节点的状态 变为 非选中状态
                        node.ParentNode.CheckState = CheckState.Unchecked;
                    }
                }
                this.ValidParentNodeIsCanleSel(node.ParentNode);
            }
        }

        /// <summary>
        /// 判断该节点下是否有节点被选中,如果有返回true
        /// </summary>
        /// <param name="node"></param>
        /// <returns></returns>
        private bool ValidIsHasCheckChildNode(DevExpress.XtraTreeList.Nodes.TreeListNode node)
        {
            bool isCheck = false;
            foreach (DevExpress.XtraTreeList.Nodes.TreeListNode cnode in node.Nodes)
            {
                if (cnode != null)
                {
                    if (cnode.CheckState == CheckState.Checked)
                    {
                        isCheck = true;
                        return isCheck;
                    }
                }
                if (cnode.HasChildren)
                {
                    isCheck = this.ValidIsHasCheckChildNode(cnode);
                    if (isCheck == true)
                    {
                        return isCheck;
                    }
                }
            }
            return isCheck;
        }

        #endregion

        #region  获取全部子节点
        private void GetChildNodes(TreeListNode parentNode, List<TreeListNode> list)
        {
            if (parentNode == null)
            {
                return;
            }
            if (parentNode.Nodes.Count > 0)
            {
                foreach (TreeListNode node in parentNode.Nodes)
                {
                    list.Add(node);
                    if (node.Nodes.Count > 0)
                    {
                        GetChildNodes(node, list);
                    }
                }
            }
        }
        #endregion

        #region 选择子节点时触发
        /// <summary>
        /// 选择子节点时触发
        /// </summary>
        /// <param name="node"></param>
        /// <param name="check"></param>
        private void SetCheckedChildNodes(TreeListNode node, CheckState check)
        {
            foreach (TreeListNode tn in node.Nodes)
            {
                tn.CheckState = check;
                if (tn.HasChildren)
                {
                    SetCheckedChildNodes(tn, check);
                }
            }
        }
        #endregion

        #region  选择父节点时触发(暂时未用)
        /// <summary>
        /// 选择父节点时触发
        /// </summary>
        /// <param name="node"></param>
        /// <param name="check"></param>
        private void SetCheckedParentNodes(TreeListNode node, CheckState check)
        {
            if (node.ParentNode != null)
            {
                bool b = false;
                CheckState state;
                foreach (TreeListNode tln in node.ParentNode.Nodes)
                {
                    state = (CheckState)tln.CheckState;
                    if (!check.Equals(state))
                    {
                        b = !b;
                        break;
                    }
                }
                node.ParentNode.CheckState = b ? CheckState.Indeterminate : check;
                SetCheckedParentNodes(node.ParentNode, check);
            }
        }
        #endregion

        #region 判断此节点下的所有孩子节点是否选中
        /// <summary>
        /// 判断此节点下的所有孩子节点是否选中
        /// </summary>
        /// <param name="node"></param>
        /// <returns></returns>
        private Boolean IsChildsChecked(TreeListNode node)
        {
            foreach (TreeListNode tln in node.ParentNode.Nodes)
            {
                if (tln.CheckState == CheckState.Unchecked)
                {
                    return false;
                }
                if (tln.HasChildren)
                {
                    IsChildsChecked(tln);
                }
            }
            return true;
        }
        #endregion

以上代码参考:点击打开链接

如果只想实现如下要求:

1:选择父节点后,子节点全部打钩;

2:选择子节点而不选择父节点,则从当前节点的父节点一直到根节点check框都是半选状态。

实现及代码如下(代码摘自http://blog.sina.com.cn/s/blog_95cfa64601019wf0.html):

一、treelist绑定的数据源是数据集(dateset)中的表,而且必须给:(当前节点id)KeyFieldName和(上一级节点id)ParentFieldName 两个属性绑定字段。

二、设置treelist1(名称)中OptionView—ShowCheckBoxes属性为true,则每个节点前面自动增加一个check框。

三、设置OptionBehavior—AllIndeterminateCheckState属性为true,则check框可以出现半选状态。

四、代码

private void treeList1_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)
          {
              if (e.Node == null) return;
              System.Data.DataRowView rov = treeList1.GetDataRecordByNode(e.Node) as System.Data.DataRowView;
              if (e.Node.CheckState == CheckState.Indeterminate)
              {
                  e.Node.CheckState = CheckState.Checked;
              }
             if (e.Node.CheckState == CheckState.Checked)
             {
                 if (e.Node.HasChildren)
                 {
                     CheckNode(e.Node);
                 }
                 ValidParentIsChecked(e.Node);
             }
             else if (e.Node.CheckState == CheckState.Unchecked)
             {
                 if (e.Node.HasChildren)
                 {
                     ClearNode(e.Node);
                 }
                 //从根节点往下 查询 是否有打钩的子节点,如果有那么 父节点的 半选状态不变否则变为 不选择状态
                 ValidParentNodeIsCanleSel(e.Node);
            }
         }

    private void CheckNode(DevExpress.XtraTreeList.Nodes.TreeListNode node)
          {
              foreach (DevExpress.XtraTreeList.Nodes.TreeListNode cnode in node.Nodes)
              {
                  if (cnode != null)
                  {
                      cnode.CheckState = CheckState.Checked;
                   }
                  if (cnode.HasChildren)
                 {
                     CheckNode(cnode);
                 }
            }
         }
        private void ValidParentIsChecked(DevExpress.XtraTreeList.Nodes.TreeListNode node)
        {
            if (node.ParentNode != null)
            {
     if(node.ParentNode.CheckState!=CheckState.Checked)
                node.ParentNode.CheckState = CheckState.Indeterminate;
                ValidParentIsChecked(node.ParentNode);
            }
        }
        private void ValidParentNodeIsCanleSel(DevExpress.XtraTreeList.Nodes.TreeListNode node)
        {
            bool isSel = false;
            if (node.ParentNode != null)
            {
                if (node.ParentNode.CheckState == CheckState.Indeterminate)
                {//如果父节点的 状态为 半选 状态 这 更具父节点 判断子节点是否打钩
                    isSel = ValidIsHasCheckChildNode(node.ParentNode);
                    if (isSel == false)
                    {//如果所有的 子节点 都没有 “选中”那么 父节点的状态 变为 非选中状态
                        node.ParentNode.CheckState = CheckState.Unchecked;
                    }
                }
                ValidParentNodeIsCanleSel(node.ParentNode);
            }
        }
        ///
        /// 判断 子节点 是否 有 状态为 “选中”状态
        /// true 表示有 false 表示为 没有
        ///
        ///
        ///
        private bool ValidIsHasCheckChildNode(DevExpress.XtraTreeList.Nodes.TreeListNode node)
        {
            bool isCheck = false;
            foreach (DevExpress.XtraTreeList.Nodes.TreeListNode cnode in node.Nodes)
            {
                if (cnode != null)
                {
                    if (cnode.CheckState == CheckState.Checked)
                    {
                        isCheck = true;
                        return isCheck;
                    }
                }
                if (cnode.HasChildren)
                {
                    isCheck = ValidIsHasCheckChildNode(cnode);
                    if (isCheck == true)
                    {
                        return isCheck;
                    }
                }
            }
            return isCheck;
        }
//通过treelist的 node节点 可以得到当前节点对应的行
 System.Data.DataRowView rov = treeList1.GetDataRecordByNode(node) as System.Data.DataRowView;
//如果想让treelist的check框不可编辑,我用到的办法是:在“BeforeCheckNode”这个事件中给出判断
  private void treeList1_BeforeCheckNode(object sender, DevExpress.XtraTreeList.CheckNodeEventArgs e)
        {
            //验证并判断 treelist 是否可编辑(默认的可编辑的) ---2010/09/06上海修改
            if (ValidOrgTreeIsEdit == false)
                e.CanCheck = false;
            else
            {
                e.CanCheck = true;
            }

        }
//如果想 一个 node 绑定是 name 字段,但是显示为:code+name 可以在(CustomDrawNodeCell)这个事件中写方法
private void TreeCat_CustomDrawNodeCell(object sender, DevExpress.XtraTreeList.CustomDrawNodeCellEventArgs e)
        {
            if (e.CellValue == null) return;
            if (e.Node == null) return;
            if (e.Column.Equals(name))
            {
                if (e.CellValue.ToString().Trim() != string.Empty)
                {
                    System.Data.DataRowView rov = treeList1.GetDataRecordByNode(e.Node) as System.Data.DataRowView;
                    if (rov != null)
                    {
                        e.CellText = rov["code"].ToString().Trim() + " - " + rov["name"].ToString().Trim();
                    }
                }
            }
        }
时间: 2024-10-12 15:42:19

dev treelist 常用用法小结的相关文章

ssh常用用法小结

ssh常用用法小结 1.连接到远程主机: 命令格式 : ssh [email protected] 或者 ssh remoteserver -l name 说明:以上两种方式都可以远程登录到远程主机,server代表远程主机,name为登录远程主机的用户名. 2.连接到远程主机指定的端口: 命令格式: ssh [email protected] -p 2222 或者 ssh remoteserver -l name -p 2222 说明:p 参数指定端口号,通常在路由里做端口映射时,我们不会把2

[转]ssh常用用法小结

ssh常用用法小结 1.连接到远程主机: 命令格式 : ssh [email protected] 或者 ssh remoteserver -l name 说明:以上两种方式都可以远程登录到远程主机,server代表远程主机,name为登录远程主机的用户名. 2.连接到远程主机指定的端口: 命令格式: ssh [email protected] -p 2222 或者 ssh remoteserver -l name -p 2222 说明:p 参数指定端口号,通常在路由里做端口映射时,我们不会把2

MySQL 数据库常用命令小结

1.MySQL常用命令 create database name; 创建数据库 use databasename; 选择数据库 drop database name 直接删除数据库,不提醒 show tables; 显示表 describe tablename; 表的详细描述 select 中加上distinct去除重复字段 mysqladmin drop databasename 删除数据库前,有提示. 显示当前mysql版本和当前日期 select version(),current_dat

结构体定义 typedef struct 用法详解和用法小结

typedef是类型定义的意思.typedef struct 是为了使用这个结构体方便.具体区别在于:若struct node {}这样来定义结构体的话.在申请node 的变量时,需要这样写,struct node n;若用typedef,可以这样写,typedef struct node{}NODE; .在申请变量时就可以这样写,NODE n;区别就在于使用时,是否可以省去struct这个关键字. 第三篇:struct和typedef struct 分三块来讲述:1 首先:在C中定义一个结构体

1:CSS中一些@规则的用法小结 2: @media用法详解

第一篇文章:@用法小结 第二篇文章:@media用法 第一篇文章:@用法小结 这篇文章主要介绍了CSS中一些@规则的用法小结,是CSS入门学习中的基础知识,需要的朋友可以参考下 at-rule是一个声明,为CSS提供执行或怎么表现的指令.每个声明以@开头,后紧跟一个可用的关键字,这个关键字充当一个标识符,用于表示CSS该做什么.这是一个通用的语法,尽管每个at-rule有其它语法变体.常规规则 常规规则遵循下面的语法: 复制代码 代码如下: @[KEYWORD] (RULE); @charset

TinyXML用法小结

TinyXML用法小结 1.      介绍 Tinyxml的官方网址:http://www.grinninglizard.com 官方介绍文档:http://www.grinninglizard.com/tinyxmldocs/tutorial0.html 在TinyXML中,根据XML的各种元素来定义了一些类: TiXmlBase:整个TinyXML模型的基类. TiXmlAttribute:对应于XML中的元素的属性. TiXmlNode:对应于DOM结构中的节点. TiXmlCommen

函数fgets和fputs、fread和fwrite、fscanf和fprintf用法小结 (转)

函数fgets和fputs.fread和fwrite.fscanf和fprintf用法小结 字符串读写函数fgets和fputs 一.读字符串函数fgets函数的功能是从指定的文件中读一个字符串到字符数组中,函数调用的形式为: fgets(字符数组名,n,文件指针): 其中的n是一个正整数.表示从文件中读出的字符串不超过 n-1个字符.在读入的最后一个字符后加上串结束标志'\0'.例如:fgets(str,n,fp);的意义是从fp所指的文件中读出n-1个字符送入 字符数组str中. [例10.

C++ typedef用法小结 (※不能不看※)

C++ typedef用法小结 (※不能不看※) 第一.四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同时声明指针型的多个对象.比如:char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, // 和一个字符变量:以下则可行:typedef char* PCHAR; // 一般用大写PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针虽然:char *pa, *pb;也可行,但相对来说没有用typedef的形式直观,

英语语法最终珍藏版笔记- 21it 用法小结

it 用法小结 it 在英语中的意思较多,用法较广,现总结如下. 一.it作句子的真正主语 1.it 指前面已经提到过的人或事物,有时指心目中的或成为问题的人或事物,作真正主语. 例如: What’s this? -It is a sheep? 这是什么??这是一只绵羊. Who is it? -It’s me (I). 谁??是我. It’s the wind shaking the window. 是风刮得窗户响. 2.it指时间.季节.一般用在无人称动词的主语. 例如: What time