您的位置:首页 > Web前端 > Node.js

WinForm 使用TreeView控件作为导航的 TreeNode(TreeView)点击事件(Click、DoubleClick ~)的一般做法

2013-01-13 23:45 316 查看
在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做一些弹出对话框的操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: