WinForm 使用TreeView控件作為導航的 TreeNode(TreeView)點擊事件(Click、DoubleClick ~)的一般做法


在WinForm程序中,我們有時候會使用TreeView控件來作為系統的側邊欄的導航(圖1),通常這些TreeNode項也是根據用戶的權限來動態生成的,那么我們在這種情況下,又如何更好的處理TreeNode的點擊事件呢?(Click、DoubleClick 等等)

圖1

在TreeNode中有一個Tag的屬性,類型為Object,通常我會巧妙的使用這個Tag來處理如上的點擊事件。由於代碼的實現比較簡單,我就直接上代碼了:代碼1定義了NavNode類,定義了 Click() 和 DoubleClick() 方法;代碼2中展示了如何實例化TreeNode並如何處理TreeNode的點擊事件;

    class NavNode
    {
        public virtual void Click()
        {
        }

        public virtual void DoubleClick()
        {
        }
    }

    class EmptyNode : NavNode
    {
    }

    //功能1
    class Fun1Node : NavNode
    {
        public override void DoubleClick()
        {
            try
            {
               IndexForm indexForm = new IndexForm();
               indexForm.Show();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }            
        }       
    }

代碼1

            //TODO: 這里可以根據用戶的權限,動態的生成菜單節點
            TreeNode node = new TreeNode("首頁");
            node.Tag = new EmptyNode();

            TreeNode nodeFun1 = new TreeNode("功能1");
            nodeFun1.Tag = new Fun1Node();
            node.Nodes.Add(nodeFun11);

            treeView1.Nodes.Add(node); 

            treeView1.NodeMouseDoubleClick += (s, e) =>
            {
                if (e.Button == System.Windows.Forms.MouseButtons.Left)
                {
                    NavNode currentNode = (NavNode)e.Node.Tag;
                    if (currentNode != null)
                    {
                        currentNode.DoubleClick();
                    }
                }
            };

代碼2

 

代碼1中的 NavNode 除了定義成普通類,還可以定義成抽象類或是接口。如果你的子類還需要繼承一些類似權限控管基類的話,那么將NavNode定義成INavNode會更好。而代碼1中的NavNode中的Click,DoubleClick方法,如果不需要做默認的實現的話,可以定義成抽象方法。這里我定義成虛函數是因為有時候我需要在NavNode的Click,DoubleClick做一些彈出對話框的操作。


免責聲明!

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



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