使用TreeView树型菜单栏(递归调用数据库自动创建菜单)

在做工控上位机项目时,当项目过于庞大,细分的流程就很多,需要管理的页面也就会增加很多,这时可以使用.NET控件TreeView进行页面的切换管理,并且实现TreeView间的互相切换。Intouch和Wonderware可以导入并使用TreeView控件。

一、使用VS开发TreeView控件

创建一个控件项目解决方案

拖一个TreeView控件,可以简单的进行节点编辑

使用TreeView树型菜单栏(递归调用数据库自动创建菜单)

Tag是需要向外传递的数据

使用TreeView树型菜单栏(递归调用数据库自动创建菜单)

 

二、出现的问题

在项目后期,对方会提出很多的改进需求,这时如果一个项目中存在过多的TreeView控件,每次改进,对于上位机系统来说就需要重新导入一次,重复过程太多,太繁琐。

解决方案:在数据库中创建菜单表,项目运行时菜单栏自动生成

 

三、创建数据库

创建数据库表,MenuId是菜单序号,MenuName为TreeView显示的页面名称,MenuCode为Tag,ParentId为该子节点的根节点

使用TreeView树型菜单栏(递归调用数据库自动创建菜单)

 

四、编写代码自动生成

按照两层架构来完成

 使用TreeView树型菜单栏(递归调用数据库自动创建菜单)

 

 实体类TreeViewNode

 1 public class TreeViewNode
 2     {
 3         public int MenuId { get; set; }
 4 
 5         public string MenuName { get; set; }
 6 
 7         public string MenuCode { get; set; }
 8 
 9         public string ParentId { get; set; }
10     }

Service层:MenuService

 1         /// <summary>
 2         /// 获取所有的菜单子项
 3         /// </summary>
 4         /// <returns></returns>
 5         public List<TreeViewNode> GetAllMenu()
 6         {
 7             string sql = "select MenuId,MenuName,MenuCode,ParentId from MenuList";
 8             List<TreeViewNode> nodeList = new List<TreeViewNode>();
 9             SqlDataReader objRead = SQLHelper.GetReader(sql);
10             while (objRead.Read())
11             {
12                 nodeList.Add(new TreeViewNode()
13                 {
14                     MenuId = Convert.ToInt32(objRead["MenuId"]),
15                     MenuName = objRead["MenuName"].ToString(),
16                     MenuCode = objRead["MenuCode"].ToString(),
17                     ParentId = objRead["ParentId"].ToString()
18                 });
19             }
20             objRead.Close();
21             return nodeList;
22         }        

TreeViewMenu控件:

 1 public partial class TreeViewMenu: UserControl
 2     {
 3         public TreeViewMenu()
 4         {
 5             InitializeComponent();
 6             LoadTreeViewMenu();
 7         }
 8 
 9         private List<TreeViewNode> nodeList = null;
10         private MenuService menuService = new MenuService();
11         private string _currentnodename;
12         //加载树形菜单
13         private void LoadTreeViewMenu()
14         {
15             this.nodeList = menuService.GetAllMenu();
16 
17             //创建一个根节点
18             this.TreeView_MenuList.Nodes.Clear();
19             TreeNode rootNode = new TreeNode();
20             rootNode.Text = "测试";
21             rootNode.Tag = "0";
22             this.TreeView_MenuList.Font = new Font(this.TreeView_MenuList.Font.FontFamily, 11);
23             rootNode.NodeFont = new Font("微软雅黑", 11.5f, FontStyle.Bold);
24             //rootNode.ImageIndex = 0;//设置根节点显示的图片
25             this.TreeView_MenuList.Nodes.Add(rootNode);//将根节点添加到TreeView节点中
26 
27             //基于递归方式添加所有子节点
28             CreateChildNode(rootNode, "0");
29             this.TreeView_MenuList.Nodes[0].Expand();//将树的一级节点展开
30         }
31         private void CreateChildNode(TreeNode parentNode, string preld)
32         {
33             //找到以所有该节点为父节点的子项
34             var nodes = from list in this.nodeList where list.ParentId.Equals(preld) select list;
35             //循环创建该节点的子节点
36             foreach (var item in nodes)
37             {
38                 //创建新的节点并设置属性
39                 TreeNode node = new TreeNode();
40                 node.Text = item.MenuName;
41                 node.Tag = item.MenuCode;
42                 //设置节点图标
43                 if (item.ParentId == "0")
44                 {
45                     //node.ImageIndex = 1;
46                     node.NodeFont = new Font("微软雅黑", 10.5f, FontStyle.Bold);
47                 }
48                 else
49                 {
50                     node.NodeFont = new Font("微软雅黑", 10.5f);
51                     //node.ImageIndex = 3;
52                 }
53                 parentNode.Nodes.Add(node);//父节点加入该子节点
54                 //使用递归实现子节点的添加
55                 CreateChildNode(node, item.MenuId.ToString());
56             }
57         }
58         private void TreeView_MenuList_AfterSelect(object sender, TreeViewEventArgs e)
59         {
60             _currentnodename = e.Node.Tag != null ? e.Node.Tag.ToString() : _currentnodename;
61         }  
62         public string CurrentNode
63         {
64             get { return _currentnodename; }
65             set { _currentnodename = value; }
66         }
67     }

运行调试一下,菜单完美的自动生成。

使用TreeView树型菜单栏(递归调用数据库自动创建菜单)

 

把生成的TreeViewMenu.dll导入进Intouch和Wonderware即可使用

使用TreeView树型菜单栏(递归调用数据库自动创建菜单)

 

 

 

 五、后期修改完善

以后修改菜单,只需在数据库中增删改即可,不必每次都重新导入控件。

并且这个控件只需要开发一次,就可以重复的导入不同的项目中,只需在数据库中配置菜单信息即可。

上一篇:C# Winform 应用程序中 TreeView 控件失去焦点后,仍然高亮显示选中的节点


下一篇:delphi TreeView 鼠标右击选择节点