DevExpress TreeList 父子节点复选框状态同步

Posted 记忆里的阳光

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DevExpress TreeList 父子节点复选框状态同步相关的知识,希望对你有一定的参考价值。

1.给TreeList tlstRegion添加一个自定列(包含)

1 TreeListColumn IsAll;
2 
3 RepositoryItemCheckEdit repositoryChk = new RepositoryItemCheckEdit();
4 chkIsAll.EditValueChanging += chkIsAll_EditValueChanging;
5 tlstRegion.RepositoryItems.Add(chkIsAll);
6 this.IsAll.ColumnEdit = chkIsAll; --IsAll是tlstRegion的TreeListColumn

2.给tlstRegion绑定数据

//01.加载区域
tlstRegion.KeyFieldName = "RegionCode";     --关联的子级编号
tlstRegion.ParentFieldName = "ParentCode";  --关联的父级编号

tlstRegion.Nodes.Clear();
CreateNode(new object[] { 0, "区域管理", "0", "", 0, "",false}, 0, true);
LoadTreeData("0", 0, false);


//02.加载树形
 private void LoadTreeData(string parentCode, int nodeId, bool isChecked)
        {
            List<CM_Region> list = _mBusinessCmRegionService.GetRegionListByParentCode(parentCode);
            if (list != null && list.Count > 0)
            {
                foreach (CM_Region item in list)
                {
                    bool hasChildren = _mBusinessCmRegionService.HasChildrenByRegionCode(item.RegionCode);  //判断当前节点是否有子节点
                    CreateNode(new object[] { item.ID, item.RegionName, item.RegionCode, item.ParentCode, item.RegionLevel, EnumHelper.GetEnumItemDesc(typeof(DataDictionary.Status), item.Status), isChecked }, nodeId, hasChildren);
                }
                if (parentCode == "0")
                {
                    tlstRegion.Nodes[0].Expanded = true;
                }
                else
                {
                    if (tlstRegion.FocusedNode != null) { tlstRegion.FocusedNode.Expanded = true; }
                }
            }
        }

//03.创建Node

  private void CreateNode(object obj, int nodeId, bool hasChildren)
        {
            tlstRegion.BeginUnboundLoad();
            TreeListNode tln = tlstRegion.AppendNode(obj, nodeId);
            tln.HasChildren = hasChildren;
            tln.ImageIndex = 1;
            tlstRegion.EndUnboundLoad();
        }

 

效果图:

3.TreeList 父子节点"包含"状态同步

在chkIsAll_EditValueChanging事件触发

        private void chkIsAll_EditValueChanging(object sender, ChangingEventArgs e)
        {
            if (e.NewValue == null)
            {
                e.Cancel = true;
                return;
            }
            bool check = DataTypeConvert.ToBoolean(e.NewValue);
            TreeListNode node = tlstRegion.FocusedNode;
            if (node != null)
            {
                node["IsAll"] = check;
            }
            //01.父节点往下面展开操作
            SetCheckedChildNodes(node, check);

            //02.字节点往上找
            SetCheckedParentNodes(node, check);
        }
       /// <summary>
        /// 全选子节点
        /// </summary>
        /// <param name="node"></param>
        /// <param name="check"></param>
        private void SetCheckedChildNodes(TreeListNode node, bool check)
        {
            for (int i = 0; i < node.Nodes.Count; i++)
            {
                node.Nodes[i]["IsAll"] = check;
                SetCheckedChildNodes(node.Nodes[i], check);
            }
        }
        /// <summary>
        /// 父节点
        /// </summary>
        /// <param name="node"></param>
        /// <param name="check"></param>
        private void SetCheckedParentNodes(TreeListNode node, bool check)
        {
            if (node.ParentNode != null)
            {
                int result = 0;//
                int reuslt1 = 0;//不打√
                int result2 = 0;//方块
                string parentCheck = node.ParentNode["IsAll"].ToString();//父节点
                for (int i = 0; i < node.ParentNode.Nodes.Count; i++)
                {
                    string nodeCheck = node.ParentNode.Nodes[i]["IsAll"].ToString();
                    if (nodeCheck.ToLower() == "true")
                    {
                        result++;
                    }
                    else if (nodeCheck.ToLower() == "false")
                    {
                        reuslt1++;
                    }
                    else
                    {
                        result2++;
                    }
                }
                if (node.ParentNode.Nodes.Count == result)//01.打√数量和父级数量一致则:父级√
                {
                    node.ParentNode["IsAll"] = true;
                }
                else if (result > 0)//02.只有有1个打钩:父级为方块
                {
                    node.ParentNode["IsAll"] = CheckState.Indeterminate;
                }
                else if (node.ParentNode.Nodes.Count == reuslt1)//03.不打√数量和父级数量一致:父级不√
                {
                    node.ParentNode["IsAll"] = false;
                }
                else if (check && result2 > 0)//04.只要有一个是方块则:父级为方块
                {
                    node.ParentNode["IsAll"] = CheckState.Indeterminate;
                }
                SetCheckedParentNodes(node.ParentNode, check);
            }
        }

 

效果图:

 

以上是关于DevExpress TreeList 父子节点复选框状态同步的主要内容,如果未能解决你的问题,请参考以下文章

treelist设置展开卡顿

devexpress treelist怎么添加自定义节点?

DevExpress之TreeList节点绑定图片

markdown DevExpress TreeList突出显示所选节点

如何以编程方式在 DevExpress TreeList 中添加节点?

在Winform界面中使用DevExpress的TreeList实现节点过滤查询的两种方式