項目設計中要使用TreeView中CheckBox(在TreeView的屬性中的CheckBoxes設為ture)。想達到一個這樣的效果:
1、選中一個節點,則子節點的狀態為當前節點的狀態並設定展開或摺疊。如:本來預設全部是摺疊的,當選擇Laboratory並使其Checked為true時,其子節點的狀態都為true並展開節點,反之。關閉節點。
2、當子節點中至少一個節點狀態為false時,其父節點狀態仍為true,但是顏色變為灰色。
這個功能發生的事件是TreeView事件中的AfterCheck
代碼如下:
private void tvRoleAll_AfterCheck(object sender, System.Windows.Forms.TreeViewEventArgs e)<br /> {</p><p> if (e.Action != TreeViewAction.Unknown)<br /> {<br /> SetNodeCheckStatus(e.Node, e.Node.Checked);<br /> SetNodeStyle(e.Node);<br /> }</p><p> }</p><p> private void SetNodeCheckStatus(TreeNode tn, bool Checked)<br /> {</p><p> if (tn == null) return;<br /> foreach (TreeNode tnChild in tn.Nodes)<br /> {</p><p> tnChild.Checked = Checked;</p><p> SetNodeCheckStatus(tnChild, Checked);</p><p> }<br /> TreeNode tnParent = tn;<br /> }</p><p> private void SetNodeStyle(TreeNode Node)<br /> {<br /> int nNodeCount = 0;<br /> if (Node.Nodes.Count != 0)<br /> {<br /> foreach (TreeNode tnTemp in Node.Nodes)<br /> {</p><p> if (tnTemp.Checked == true)</p><p> nNodeCount++;<br /> }</p><p> if (nNodeCount == Node.Nodes.Count)<br /> {<br /> Node.Checked = true;<br /> Node.ExpandAll();<br /> Node.ForeColor = Color.Black;<br /> }<br /> else if (nNodeCount == 0)<br /> {<br /> Node.Checked = false;<br /> Node.Collapse();<br /> Node.ForeColor = Color.Black;<br /> }<br /> else<br /> {<br /> Node.Checked = true;<br /> Node.ForeColor = Color.Gray;<br /> }<br /> }<br /> //當前節點選擇完後,判斷父節點的狀態,調用此方法遞迴。<br /> if (Node.Parent != null)<br /> SetNodeStyle(Node.Parent);<br /> } </p><p>