在作工控上位機項目時,當項目過於龐大,細分的流程就不少,須要管理的頁面也就會增長不少,這時能夠使用.NET控件TreeView進行頁面的切換管理,而且實現TreeView間的互相切換。Intouch和Wonderware能夠導入並使用TreeView控件。node
1、使用VS開發TreeView控件sql
建立一個控件項目解決方案數據庫
拖一個TreeView控件,能夠簡單的進行節點編輯架構
Tag是須要向外傳遞的數據測試
2、出現的問題this
在項目後期,對方會提出不少的改進需求,這時若是一個項目中存在過多的TreeView控件,每次改進,對於上位機系統來講就須要從新導入一次,重複過程太多,太繁瑣。spa
解決方案:在數據庫中建立菜單表,項目運行時菜單欄自動生成調試
3、建立數據庫code
建立數據庫表,MenuId是菜單序號,MenuName爲TreeView顯示的頁面名稱,MenuCode爲Tag,ParentId爲該子節點的根節點blog
4、編寫代碼自動生成
按照兩層架構來完成
實體類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 }
運行調試一下,菜單完美的自動生成。
把生成的TreeViewMenu.dll導入進Intouch和Wonderware便可使用
5、後期修改完善
之後修改菜單,只需在數據庫中增刪改便可,沒必要每次都從新導入控件。
而且這個控件只須要開發一次,就能夠重複的導入不一樣的項目中,只需在數據庫中配置菜單信息便可。