TreeView一個很棒的控件,我們在做WEB開發時常常犯困的一個東東。當然這里介紹winform里面的用法嘮。
先介紹幾個屬性吧,CheckBoxes設置為true的話樹形節點前面會出現checkbox勾選框、ImageList綁定樹形里面的圖標(界面上放一個Imgelist控件,綁定上即可)、ShowLines(樹形展開時顯示線條)等等
哦,這個方法好,this.MenutreeView.ExpandAll();即Treeview加載后全部展開。
下面先介紹一個簡單的菜單用法
1、TreeView節點的設置和選取節點
TreeView靜態節點的設置方法很簡單,主要用在軟件的快捷導航中。貼圖,可以設置多級節點,每個節點設置Name和Text屬性即可,如果覺得不美觀,可以放一些圖標。
本例中的圖標是用ImageList綁定到里面的,還是比較簡單。

設置好節點后,就可以寫節點的事件了,貼代碼
/// <summary> /// 樹形目錄菜單 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> /// AfterSelect事件是點擊節點時的事件 private void MenutreeView_AfterSelect(object sender, TreeViewEventArgs e) { string nodeselect = MenutreeView.SelectedNode.Name; switch (nodeselect) { case "用戶管理": ShowUsermanager(); break; case "競賽項目管理": ShowItemFrm(); break; case "參賽單位管理": ShowDepartFrm(); break; case "運動員信息": ShowMemberInfoFrm(); break; case "代表隊名單": ShowMatchTeamFrm(); break; case "隨機分組": ShowRandomGroupFrm(); break; case "分組信息": ShowGroupInfoFrm(); break; case "評分管理": ShowPointFrm(); break; case "成績管理": ShowScoreFrm(); break; default: break; } }
看到了吧,還是比較簡單,case到以后,執行相應的方法即可,本例中主要是show一些窗口。
2、TreeView動態綁定及獲取勾選值
這里介紹一個權限的示例,本例是將選中的節點放置在listbox中
上圖
拿到了text和name兩個值
private void BindTreeView() { treeView1.LabelEdit = false;//不可編輯 //添加結點 TreeNode root = new TreeNode(); root.Text = "根節點"; root.Name = "All"; //一級 TreeNode node1 = new TreeNode(); node1.Text = "新增"; node1.Name = "Add"; TreeNode node2 = new TreeNode(); node2.Text = "編輯"; node2.Name = "Edit"; //二級 TreeNode node11 = new TreeNode(); node11.Text = "新增管理員"; node11.Name = "AddManager"; TreeNode node12 = new TreeNode(); node12.Text = "新增普通用戶"; node12.Name = "AddUser"; TreeNode node21 = new TreeNode(); node21.Text = "編輯管理員"; node21.Name = "EditManager"; TreeNode node22 = new TreeNode(); node22.Text = "編輯普通用戶"; node22.Name = "EditUser"; //二級加入一級 node1.Nodes.Add(node11); node1.Nodes.Add(node12); node2.Nodes.Add(node21); node2.Nodes.Add(node22); //一級加入根 root.Nodes.Add(node1); root.Nodes.Add(node2); // treeView1.Nodes.Add(root); } private void button1_Click(object sender, EventArgs e) { foreach (TreeNode node in treeView1.Nodes)//實際上treeVIew1里面只有1個根節點,所以要用遞歸方法 { SetTreeViewList(node); } } //遞歸方法 private void SetTreeViewList(TreeNode node) { if (node.Checked) { listBox1.Items.Add(node.Text + "&" + node.Name); } if (node.Nodes.Count > 0) { foreach (TreeNode cnode in node.Nodes) { SetTreeViewList(cnode);//遞歸 } } }
由於Treeview遍歷只能拿到一個根節點(這點大家可以做實驗看看),因此必須使用遞歸才能找到其他子節點,下面再補充一點就是子節點全部選中后父節點自動選中,父節點選中后子節點全部選中
貼代碼,下面這段接着上面的即可
//勾選的事件,必須寫在AfterCheck事件中 private void treeView1_AfterCheck(object sender, TreeViewEventArgs e) { if (e.Action == TreeViewAction.ByMouse)//這句還是比較重要哦,如果沒有的話就會陷入死循環 { if (e.Node.Checked) { //選中其子節點 setChildNodeCheckedState(e.Node, true); //如果有父節點,選中其所有父節點 if (e.Node.Parent != null) { setParentNodeCheckedState(e.Node, true); } } else { //取消其子節點 setChildNodeCheckedState(e.Node, false); //取消其所有父節點 if (e.Node.Parent != null) { setParentNodeCheckedState(e.Node, false); } } } } //子節點遞歸 private void setChildNodeCheckedState(TreeNode currNode, bool state) { TreeNodeCollection nodes = currNode.Nodes; if (nodes.Count > 0) foreach (TreeNode tn in nodes) { tn.Checked = state; setChildNodeCheckedState(tn, state); } } //父節點遞歸 private void setParentNodeCheckedState(TreeNode currNode, bool state) { TreeNode parentNode = currNode.Parent; parentNode.Checked = state; if (currNode.Parent.Parent != null) { setParentNodeCheckedState(currNode.Parent, state); } }
上個圖,看下效果

如此之類的做法可以直接將權限做到窗口的按鈕上,然后自己寫一個基類Form根據權限來判斷菜單、按鈕是否顯示、是否可用等,所有的窗體繼承自這個基類窗體就可以實現一勞永逸的權限控制了。具體示例有時間了奉上。
