Winform開發常用控件之TreeView菜單導航和權限用法


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根據權限來判斷菜單、按鈕是否顯示、是否可用等,所有的窗體繼承自這個基類窗體就可以實現一勞永逸的權限控制了。具體示例有時間了奉上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM