码迷,mamicode.com
首页 > 其他好文 > 详细

DEV 控件使用之:TreeList

时间:2015-07-23 06:33:21      阅读:301      评论:0      收藏:0      [点我收藏+]

标签:

使用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         //初始化方法加载测试数据
 22         private void FrmTreeList_Load(object sender, EventArgs e)
 23         {
 24             DataTable dt = new DataTable();
 25             dt.Columns.Add("ID", typeof(int));
 26             dt.Columns.Add("ItemName", typeof(string));
 27             dt.Columns.Add("ParentID", typeof(int));
 28             DataRow dr = dt.NewRow();
 29             dr["ID"] = 1;
 30             dr["ItemName"] = "根节点";
 31             dr["ParentID"] = -1;
 32             dt.Rows.Add(dr);
 33             DataRow dr2 = dt.NewRow();
 34             dr2["Id"] = 2;
 35             dr2["ItemName"] = "根节点2";
 36             dr2["ParentID"] = 0;
 37             dt.Rows.Add(dr2);
 38             DataRow dr3 = dt.NewRow();
 39             dr3["ID"] = 3;
 40             dr3["ItemName"] = "根节点3";
 41             dr3["ParentID"] = 0;
 42             dt.Rows.Add(dr3);
 43 
 44             DataRow dr4 = dt.NewRow();
 45             dr4["ID"] = 4;
 46             dr4["ItemName"] = "子节点1";
 47             dr4["ParentID"] = 1;
 48             dt.Rows.Add(dr4);
 49 
 50             DataRow dr5 = dt.NewRow();
 51             dr5["ID"] = 5;
 52             dr5["ItemName"] = "子节点2";
 53             dr5["ParentID"] = 1;
 54             dt.Rows.Add(dr5);
 55 
 56             DataRow dr6 = dt.NewRow();
 57             dr6["ID"] = 6;
 58             dr6["ItemName"] = "子节点2";
 59             dr6["ParentID"] = 5;
 60             dt.Rows.Add(dr6);
 61 
 62             this.treeList1.DataSource = dt;
 63 
 64             //这里是用来测试的节点
 65             selectItem.Add("子节点1");
 66             selectItem.Add("根节点2");
 67             // 设置初始状态
 68             SetCheckState();
 69 
 70         }
 71 
 72         /// <summary>
 73         /// 要被选中的节点
 74         /// </summary>
 75         private List<string> selectItem = new List<string>();
 76 
 77         //设置节点的选中状态
 78         private void SetCheckState()
 79         {
 80             foreach (TreeListNode n in treeList1.Nodes)
 81             {
 82                 DataRowView drv = (DataRowView)treeList1.GetDataRecordByNode(n);
 83                 string nodeName = string.Empty;
 84                 if (drv != null)
 85                 {
 86                     nodeName = drv["ItemName"] != null ? Convert.ToString(drv["ItemName"]) : "";
 87                 }
 88                 bool checkd = selectItem.Contains(nodeName);
 89                 if (checkd)
 90                     n.CheckState = CheckState.Checked;
 91                 //如果当前结点有子结点集合,再枚举所有子结点
 92                 if (n.HasChildren)
 93                     this.SetChildNodeState(n);
 94             }
 95 
 96         }
 97 
 98         /// <summary>
 99         /// 设置子节点状态
100         /// </summary>
101         /// <param name="parentNode"></param>
102         private void SetChildNodeState(TreeListNode parentNode)
103         {
104             foreach (TreeListNode n in parentNode.Nodes)
105             {
106                 DataRowView drv = (DataRowView)treeList1.GetDataRecordByNode(n);
107                 string nodeName = string.Empty;
108                 if (drv != null)
109                 {
110                     nodeName = drv["ItemName"] != null ? Convert.ToString(drv["ItemName"]) : "";
111                 }
112                 bool checkd = selectItem.Contains(nodeName);
113                 if (checkd)
114                 {
115                     parentNode.CheckState = CheckState.Checked;
116                     n.CheckState = CheckState.Checked;
117                 }
118                 if (n.HasChildren)
119                     this.SetChildNodeState(n);
120             }
121         }
122 
123 
124 
125         //节点选中后处理
126         private void treeList1_AfterCheckNode(object sender, DevExpress.XtraTreeList.NodeEventArgs e)
127         {
128             SetChildrenNodeState(e.Node, e.Node.CheckState);
129             SetParentNode(e.Node);
130         }
131 
132         //设置父节点的状态
133         private void SetChildrenNodeState(TreeListNode node, CheckState state)
134         {
135             node.CheckState = state;
136             if (node.HasChildren)
137             {
138                 SetChildNodeState(node, state);
139             }
140         }
141         //设置子节点的状态(当选中父节点时所有的子节点也要选中)
142         private void SetChildNodeState(TreeListNode node, CheckState state)
143         {
144             foreach (TreeListNode item in node.Nodes)
145             {
146                 item.CheckState = state;
147                 if (item.HasChildren)
148                 {
149                     SetChildNodeState(item, state);
150                 }
151             }
152         }
153 
154         //检查节点是否是最后一个被选中或取消的子节点,如果是要对父节点进行设置(选中或不选中)
155         private void SetParentNode(TreeListNode node)
156         {
157             if (node.ParentNode != null)
158             {
159                 bool state = true;
160                 foreach (TreeListNode item in node.ParentNode.Nodes)
161                 {
162                     if (item.CheckState != node.CheckState)
163                     {
164                         state = false;
165                         break;
166                     }
167                 }
168                 if (state)
169                 {
170                     node.ParentNode.CheckState = node.CheckState;
171                 }
172             }
173         }
174     }
175 }
View Code


 

DEV 控件使用之:TreeList

标签:

原文地址:http://www.cnblogs.com/heweijian/p/Tim.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!