zoukankan      html  css  js  c++  java
  • TreeList个人总结

    最近项目中要求用dev 控件的treelist 树形控件。

    如下图

    要求如下:

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

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

    具体实现如下:

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

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

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

    四、

    代码
     1  private void treeList1_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)
     2         {
     3             if (e.Node == nullreturn;
     4             System.Data.DataRowView rov = treeList1.GetDataRecordByNode(e.Node) as System.Data.DataRowView;
     5             if (e.Node.CheckState == CheckState.Indeterminate)
     6             {
     7                 e.Node.CheckState = CheckState.Checked;
     8             }
     9             if (e.Node.CheckState == CheckState.Checked)
    10             {
    11                 if (e.Node.HasChildren)
    12                 {
    13                     CheckNode(e.Node);
    14                 }
    15                 ValidParentIsChecked(e.Node);
    16             }
    17             else if (e.Node.CheckState == CheckState.Unchecked)
    18             {
    19                 if (e.Node.HasChildren)
    20                 {
    21                     ClearNode(e.Node);
    22                 }
    23                 //从根节点往下 查询 是否有打钩的子节点,如果有那么 父节点的 半选状态不变否则变为 不选择状态
    24                 ValidParentNodeIsCanleSel(e.Node);
    25             }
    26         }
    27 
    代码
     1   private void CheckNode(DevExpress.XtraTreeList.Nodes.TreeListNode node)
     2         {
     3             foreach (DevExpress.XtraTreeList.Nodes.TreeListNode cnode in node.Nodes)
     4             {
     5                 if (cnode != null)
     6                 {
     7                     cnode.CheckState = CheckState.Checked;
     8                   }
     9                 if (cnode.HasChildren)
    10                 {
    11                     CheckNode(cnode);
    12                 }
    13             }
    14         }
    代码
     /// <summary>
            
    /// </summary>
            
    /// <param name="node"></param>
            
    /// <returns></returns>
            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);
                }
            }
     
    /// <summary>
            
    /// 判断 子节点 是否 有 状态为 “选中”状态 
            
    /// true 表示有 false 表示为 没有
            
    /// </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 
    = 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 == nullreturn;
                
    if (e.Node == nullreturn;
                
    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();
                        }
                    }
                }
            }

    以上就是目前对treelist的一些基本操作。主要是用到递归方法实现对节点的控制。

  • 相关阅读:
    30、深入浅出MFC学习笔记,多线程
    29、深入浅出MFC学习笔记,多重文件和视图
    5、程序设计实践读书笔记
    6、C++ Primer 4th 笔记,标准IO库(1)
    SQL Server流程控制 7,Try...Catch 语句
    TSQL:流程控制 4,Case 语句
    SQL Server事务处理(Tansaction)与锁(Lock)
    SQL Server9,流程控制 Execute 语句(*)
    SQL Server流程控制 2,If...Else 语句
    SQL Server流程控制 1,Begin...End 语句
  • 原文地址:https://www.cnblogs.com/6303c/p/TreeList.html
Copyright © 2011-2022 走看看