在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做一些彈出對話框的操作。
