C# 实现TreeView节点的三种状态
为了实现TreeView节点的三种状态:全部选择 ,部分选择,没有选择 。当节点的所有子节点的都处于选择状态时,则该节点也处于选择状态;当节点的部分节点处于选择状态时,则该节点处于部分选择状态;当该节点的所有子节点都没有处于选择状态,则该节点处于没有选择状态。而微软.net提供的TreeView的节点只提供了两种状态,用CheckBox实现的。要想实现三种状态,偶查了很多,最后还是觉得鄙人的这种做法稍微简洁也很容易理解。
1 使用photoshop处理三张13*13的图片:
2 在TreeView上添加一个 ImageList 设置其Name =imgStatusList ; ColorDepth= Depth32Bit; ImageSize = 11*11 添加上面三幅图片
3 在TreeView所在的窗体代码中 加入:treeView1.ImageList = this.imgStatusList;(不要直接设置其属性)
4 首先在treeView1_NodeMouseClick中获得选择节点的状态,并设置其新的状态,在改变其子节点和父节点的状态。
源代码
1 /// <summary>
2 /// 当单击节点时触发
3 /// </summary>
4 /// <param name="sender"></param>
5 /// <param name="e"></param>
6 /// 作者:阮班波
7 /// 日期:2009-03-10
8 private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
9 {
10 TreeNode node = e.Node;// this.treeView1.SelectedNode;
11 if (node.ImageIndex == 0)
12 {
13 node.ImageIndex = 2;
14 node.SelectedImageIndex = 2;
15 }
16 else
17 {
18 node.ImageIndex = 0;
19 node.SelectedImageIndex = 0;
20 }
21 //更改子节点和父节点的状态
22 ChangeStatus(node);
23 //刷新树形控件
24 treeView1.Refresh();
25 }
26
27 /// <summary>
28 /// 更改该节点的父子节点的状态
29 /// </summary>
30 /// <param name="node"></param>
31 /// 作者:阮班波
32 /// 日期:2009-03-10
33 private void ChangeStatus(TreeNode node)
34 {
35 //更改子节点
36 ChangeChildNode(node);
37 //更改父节点
38 ChangeParentNode(node);
39 }
40 /// <summary>
41 /// 修改当前节点的子节点的状态
42 /// </summary>
43 /// <param name="node"></param>
44 /// 作者:阮班波
45 /// 日期:2009-03-10
46 private void ChangeChildNode(TreeNode node)
47 {
48 //处理子节点
49 if (node.Nodes.Count > 0 )
50 {
51 //存在子节点
52 for (int i = 0; i < node.Nodes.Count; i++)
53 {
54 if (node.ImageIndex == 2)
55 {
56 //节点处于选中状态,则子节点也处于选中状态
57 node.Nodes[i].ImageIndex = 2;
58 }
59 else if (node.ImageIndex == 0)
60 {
61 //节点处于不选中状态,则子节点也处于不选中状态
62 node.Nodes[i].ImageIndex = 0;
63 }
64 //递归更新子节点状态
65 ChangeChildNode(node.Nodes[i]);
66 }
67 }
68 }
69 /// <summary>
70 /// 修改当前节点的父节点的状态
71 /// </summary>
72 /// <param name="node"></param>
73 /// 作者:阮班波
74 /// 日期:2009-03-10
75 private void ChangeParentNode(TreeNode node)
76 {
77 if (node.Parent != null)
78 {
79 //父节点存在
80 if (node.ImageIndex == 0) //当前节点处于未选中状态
81 {
82 //处理父节点
83 int j = 0;
84 for (j = 0; j < node.Parent.Nodes.Count; j++)
85 {
86 if (node.Parent.Nodes[j].ImageIndex != 0)
87 {
88 //该节点只要有一个子节点处于未选中状态,则该节点处于不完全选中状态
89 node.Parent.ImageIndex = 1;
90 break;
91 }
92 }
93 if (j >= node.Parent.Nodes.Count)
94 {
95 //该节点的所有子节点都处于未选中状态,则该节点处于未选中状态
96 node.Parent.ImageIndex = 0;
97 }
98 }
99 else //当前节点处于选中或不完全选中状态
100 {
101 //处理父节点
102 int j = 0;
103 for (j = 0; j < node.Parent.Nodes.Count; j++)
104 {
105 if (node.Parent.Nodes[j].ImageIndex != 2)
106 {
107 //该节点只要有一个子节点处于选中状态,则该节点处于不完全选中状态
108 node.Parent.ImageIndex = 1;
109 break;
110 }
111 }
112 if (j >= node.Parent.Nodes.Count)
113 {
114 //该节点所有子节点处于选中状态,则该节点处于选中状态
115 node.Parent.ImageIndex = 2;
116 }
117 }
118 //递归处理父节点状态
119 ChangeParentNode(node.Parent);
120 }
121 }
122
123 /// <summary>
124 /// 根据角色对应的权限设置所有TreeView权限节点的状态
125 /// </summary>
126 /// <param name="tnc"></param>
127 /// <param name="list"></param>
128 /// 作者:阮班波
129 /// 日期:2009-03-11
130 private void SetNodesStatus(TreeNodeCollection tnc, List<SystemFunction> list)
131 {
132 foreach (TreeNode node in tnc)
133 {
134 if (list != null)
135 {
136 for (int i = 0; i < list.Count; i++)
137 {
138 if (list[i].FunctionName.Equals(node.Text))
139 {
140 node.ImageIndex = 2;
141 break;
142 }
143 else
144 node.ImageIndex = 0;
145 }
146
147 }
148 else
149 {
150 node.ImageIndex = 0;
151 }
152 SetNodesStatus(node.Nodes, list);
153 }
154 }
1 /// <summary>
2 /// 当单击节点时触发
3 /// </summary>
4 /// <param name="sender"></param>
5 /// <param name="e"></param>
6 /// 作者:阮班波
7 /// 日期:2009-03-10
8 private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
9 {
10 TreeNode node = e.Node;// this.treeView1.SelectedNode;
11 if (node.ImageIndex == 0)
12 {
13 node.ImageIndex = 2;
14 node.SelectedImageIndex = 2;
15 }
16 else
17 {
18 node.ImageIndex = 0;
19 node.SelectedImageIndex = 0;
20 }
21 //更改子节点和父节点的状态
22 ChangeStatus(node);
23 //刷新树形控件
24 treeView1.Refresh();
25 }
26
27 /// <summary>
28 /// 更改该节点的父子节点的状态
29 /// </summary>
30 /// <param name="node"></param>
31 /// 作者:阮班波
32 /// 日期:2009-03-10
33 private void ChangeStatus(TreeNode node)
34 {
35 //更改子节点
36 ChangeChildNode(node);
37 //更改父节点
38 ChangeParentNode(node);
39 }
40 /// <summary>
41 /// 修改当前节点的子节点的状态
42 /// </summary>
43 /// <param name="node"></param>
44 /// 作者:阮班波
45 /// 日期:2009-03-10
46 private void ChangeChildNode(TreeNode node)
47 {
48 //处理子节点
49 if (node.Nodes.Count > 0 )
50 {
51 //存在子节点
52 for (int i = 0; i < node.Nodes.Count; i++)
53 {
54 if (node.ImageIndex == 2)
55 {
56 //节点处于选中状态,则子节点也处于选中状态
57 node.Nodes[i].ImageIndex = 2;
58 }
59 else if (node.ImageIndex == 0)
60 {
61 //节点处于不选中状态,则子节点也处于不选中状态
62 node.Nodes[i].ImageIndex = 0;
63 }
64 //递归更新子节点状态
65 ChangeChildNode(node.Nodes[i]);
66 }
67 }
68 }
69 /// <summary>
70 /// 修改当前节点的父节点的状态
71 /// </summary>
72 /// <param name="node"></param>
73 /// 作者:阮班波
74 /// 日期:2009-03-10
75 private void ChangeParentNode(TreeNode node)
76 {
77 if (node.Parent != null)
78 {
79 //父节点存在
80 if (node.ImageIndex == 0) //当前节点处于未选中状态
81 {
82 //处理父节点
83 int j = 0;
84 for (j = 0; j < node.Parent.Nodes.Count; j++)
85 {
86 if (node.Parent.Nodes[j].ImageIndex != 0)
87 {
88 //该节点只要有一个子节点处于未选中状态,则该节点处于不完全选中状态
89 node.Parent.ImageIndex = 1;
90 break;
91 }
92 }
93 if (j >= node.Parent.Nodes.Count)
94 {
95 //该节点的所有子节点都处于未选中状态,则该节点处于未选中状态
96 node.Parent.ImageIndex = 0;
97 }
98 }
99 else //当前节点处于选中或不完全选中状态
100 {
101 //处理父节点
102 int j = 0;
103 for (j = 0; j < node.Parent.Nodes.Count; j++)
104 {
105 if (node.Parent.Nodes[j].ImageIndex != 2)
106 {
107 //该节点只要有一个子节点处于选中状态,则该节点处于不完全选中状态
108 node.Parent.ImageIndex = 1;
109 break;
110 }
111 }
112 if (j >= node.Parent.Nodes.Count)
113 {
114 //该节点所有子节点处于选中状态,则该节点处于选中状态
115 node.Parent.ImageIndex = 2;
116 }
117 }
118 //递归处理父节点状态
119 ChangeParentNode(node.Parent);
120 }
121 }
122
123 /// <summary>
124 /// 根据角色对应的权限设置所有TreeView权限节点的状态
125 /// </summary>
126 /// <param name="tnc"></param>
127 /// <param name="list"></param>
128 /// 作者:阮班波
129 /// 日期:2009-03-11
130 private void SetNodesStatus(TreeNodeCollection tnc, List<SystemFunction> list)
131 {
132 foreach (TreeNode node in tnc)
133 {
134 if (list != null)
135 {
136 for (int i = 0; i < list.Count; i++)
137 {
138 if (list[i].FunctionName.Equals(node.Text))
139 {
140 node.ImageIndex = 2;
141 break;
142 }
143 else
144 node.ImageIndex = 0;
145 }
146
147 }
148 else
149 {
150 node.ImageIndex = 0;
151 }
152 SetNodesStatus(node.Nodes, list);
153 }
154 }