• DEV 控件使用之:TreeList


    使用DEV控件也有一段时间了,一直想写点东西。最近又使用到TreeList控件,这个控件对于刚使用的人来说确实不好掌握。我想把自己知道的写下来,让还不熟悉的慢慢学会使用,对于会使用的大家交流下。如果有用的不正确或不恰当的欢迎各位指正批评。

    一,第一步从控件库里拖出TreeList

    二,设置属性

                this.treeList1.OptionsView.ShowCheckBoxes = true;
                this.treeList1.OptionsView.ShowColumns = false;
                this.treeList1.OptionsView.ShowHorzLines = false;
                this.treeList1.OptionsView.ShowIndicator = false;
                this.treeList1.OptionsView.ShowVertLines = false;

    三,构造测试数据(参考方法 FrmTreeList_Load)

    四,设置选中项(参考方法 SetCheckState )

    五,当前操作的节点为某个节点的最后一个子节点时,设置父节点的状态

    这里需要一个 事件即:treeList1_AfterCheckNode 这个方法在属性事件里找到。

    页面所有代码如下:

      1 using System;
      2 using System.Collections.Generic;
      3 using System.ComponentModel;
      4 using System.Data;
      5 using System.Drawing;
      6 using System.Linq;
      7 using System.Text;
      8 using System.Threading.Tasks;
      9 using System.Windows.Forms;
     10 using DevExpress.XtraTreeList.Nodes;
     11 
     12 namespace WinForm2
     13 {
     14     public partial class FrmTreeList : DevExpress.XtraEditors.XtraForm
     15     {
     16         public FrmTreeList()
     17         {
     18             InitializeComponent();
     19         }
     20 
     21         private DataTable dt = new DataTable();
     22         /// <summary>
     23         /// 要被选中的节点
     24         /// </summary>
     25         public List<string> SelectItem = new List<string>();
     26 
     27         //初始化方法加载测试数据
     28         private void FrmTreeList_Load(object sender, EventArgs e)
     29         {
     30             dt.Columns.Add("ID", typeof(int));
     31             dt.Columns.Add("ItemName", typeof(string));
     32             dt.Columns.Add("ParentID", typeof(int));
     33 
     34             DataRow dr = dt.NewRow();
     35             dr["ID"] = 1;
     36             dr["ItemName"] = "根节点";
     37             dr["ParentID"] = -1;
     38             dt.Rows.Add(dr);
     39 
     40             DataRow dr2 = dt.NewRow();
     41             dr2["Id"] = 2;
     42             dr2["ItemName"] = "根节点2";
     43             dr2["ParentID"] = 0;
     44             dt.Rows.Add(dr2);
     45 
     46             DataRow dr3 = dt.NewRow();
     47             dr3["ID"] = 3;
     48             dr3["ItemName"] = "根节点3";
     49             dr3["ParentID"] = 0;
     50             dt.Rows.Add(dr3);
     51 
     52             DataRow dr4 = dt.NewRow();
     53             dr4["ID"] = 4;
     54             dr4["ItemName"] = "子节点1";
     55             dr4["ParentID"] = 1;
     56             dt.Rows.Add(dr4);
     57 
     58             DataRow dr5 = dt.NewRow();
     59             dr5["ID"] = 5;
     60             dr5["ItemName"] = "子节点2";
     61             dr5["ParentID"] = 1;
     62             dt.Rows.Add(dr5);
     63 
     64             DataRow dr6 = dt.NewRow();
     65             dr6["ID"] = 6;
     66             dr6["ItemName"] = "子子节点1";
     67             dr6["ParentID"] = 5;
     68             dt.Rows.Add(dr6);
     69 
     70             DataRow dr7 = dt.NewRow();
     71             dr7["ID"] = 7;
     72             dr7["ItemName"] = "子子节点2";
     73             dr7["ParentID"] = 5;
     74             dt.Rows.Add(dr7);
     75 
     76             this.treeList1.DataSource = dt;
     77             this.treeList1.KeyFieldName = "ID";
     78             this.treeList1.ParentFieldName = "ParentID";
     79 
     80             //这里是用来测试的节点
     81             SelectItem.Add("子子节点1");
     82             SelectItem.Add("根节点2");
     83             // 设置初始状态
     84             SetCheckState(SelectItem, "ItemName");
     85 
     86         }
     87 
     88         #region 按配置选中相关节点项
     89 
     90         //设置节点的选中状态
     91         private void SetCheckState(List<string> list, string fieldName)
     92         {
     93             foreach (TreeListNode n in treeList1.Nodes)
     94             {
     95                 DataRowView drv = (DataRowView)treeList1.GetDataRecordByNode(n);
     96                 string nodeName = (drv != null && drv[fieldName] != null) ? Convert.ToString(drv[fieldName]) : string.Empty;
     97                 if (list.Contains(nodeName))
     98                 {
     99                     n.CheckState = CheckState.Checked;
    100                 }
    101                 //如果当前结点有子结点,再枚举所有子结点
    102                 if (n.HasChildren)
    103                     this.SelectedChildNode(n, fieldName);
    104             }
    105 
    106         }
    107 
    108         /// <summary>
    109         /// 设置子节点状态
    110         /// </summary>
    111         /// <param name="parentNode"></param>
    112         private void SelectedChildNode(TreeListNode parentNode, string fieldName)
    113         {
    114             foreach (TreeListNode n in parentNode.Nodes)
    115             {
    116                 DataRowView drv = (DataRowView)treeList1.GetDataRecordByNode(n);
    117                 string nodeName = (drv != null && drv[fieldName] != null) ? Convert.ToString(drv[fieldName]) : string.Empty;
    118                 if (SelectItem.Contains(nodeName))
    119                 {
    120                     n.CheckState = CheckState.Checked;
    121                     // 这里是将父节点,父节点的父节点设置为选中状态
    122                     SelectedParentNode(n);
    123                 }
    124                 if (n.HasChildren) this.SelectedChildNode(n, fieldName);
    125             }
    126         }
    127 
    128         /// <summary>
    129         /// 设置相关的父节点被选中
    130         /// </summary>
    131         /// <param name="parentNode"></param>
    132         private void SelectedParentNode(TreeListNode parentNode)
    133         {
    134             if (parentNode.ParentNode != null)
    135             {
    136                 parentNode.ParentNode.CheckState = CheckState.Checked;
    137                 SelectedParentNode(parentNode.ParentNode);
    138             }
    139         }
    140 
    141         #endregion
    142 
    143         #region 节点选中或取消相关处理
    144 
    145         //节点选中后处理
    146         private void treeList1_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)
    147         {
    148             SetChildNodeState(e.Node, e.Node.CheckState);
    149             SetParentNodeState(e.Node);
    150         }
    151 
    152         //设置子节点的状态(当选中父节点时所有的子节点也要选中)
    153         private void SetChildNodeState(TreeListNode node, CheckState state)
    154         {
    
    155             if (node.HasChildren)
    156             {
    157                 foreach (TreeListNode item in node.Nodes)
    158                 {
    159                     item.CheckState = state;
    160                     if (item.HasChildren) SetChildNodeState(item, state);
    161                 }
    162             }
    163         }
    164 
    165         //检查节点是否是最后一个被选中或取消的子节点,如果是要对父节点进行设置(选中或不选中)
    166         private void SetParentNodeState(TreeListNode node)
    167         {
    168             if (node.ParentNode != null)
    169             {
    170                 // 方法一
    171                 //bool state = false;
    172                 //foreach (TreeListNode item in node.ParentNode.Nodes)
    173                 //{
    174                 //    state = item.Checked;
    175                 //    if (state) break;
    176                 //}
    177                 //node.ParentNode.Checked = state;
    178 
    179                 // 方法二
    180                 bool state = true;
    181                 node.ParentNode.CheckState = CheckState.Checked;
    182                 foreach (TreeListNode item in node.ParentNode.Nodes)
    183                 {
    184                     if (item.CheckState != node.CheckState)
    185                     {
    186                         state = false;
    187                         break;
    188                     }
    189                 }
    190                 if (state) node.ParentNode.CheckState = node.CheckState;
    191 
    192                 // 递归检查父父节点
    193                 SetParentNodeState(node.ParentNode);
    194             }
    195         }
    196 
    197         #endregion
    198 
    199         // 设置选中项的背景
    200         private void treeList1_CustomDrawNodeCell(object sender, DevExpress.XtraTreeList.CustomDrawNodeCellEventArgs e)
    201         {
    202             if (e.Node.Checked)
    203             {
    204                 e.Appearance.BackColor = Color.LightBlue;
    205             }
    206             else
    207             {
    208                 e.Appearance.BackColor = Color.Transparent;
    209             }
    210         }
    211     }
    212 }
    View Code


     

    本人专注于.net平台开发,擅长开发企业管理系统,CRM系统,ERP系统,财务系统,权限系统,非常乐意跟大家讨论相关系统的设计和开发技巧
  • 相关阅读:
    objcopy使用
    linux中的strip命令简介
    strace命令详解
    bash执行顺序:alias --> function --> builtin --> program
    Ubuntu下安装docker
    uvm中类继承和phase
    error和exception有什么区别?
    sleep() 和 wait() 有什么区别?
    CSS3实现环形进度条?
    请写出你最常见到的5个runtime exception?
  • 原文地址:https://www.cnblogs.com/heweijian/p/Tim.html
Copyright © 2020-2023  润新知