在做工控上位機專案時,當專案過于龐大,細分的流程就很多,需要管理的頁面也就會增加很多,這時可以使用.NET控制元件TreeView進行頁面的切換管理,并且實作TreeView間的互相切換,Intouch和Wonderware可以匯入并使用TreeView控制元件,
一、使用VS開發TreeView控制元件
創建一個控制元件專案解決方案
拖一個TreeView控制元件,可以簡單的進行節點編輯

Tag是需要向外傳遞的資料

二、出現的問題
在專案后期,對方會提出很多的改進需求,這時如果一個專案中存在過多的TreeView控制元件,每次改進,對于上位機系統來說就需要重新匯入一次,重復程序太多,太繁瑣,
解決方案:在資料庫中創建選單表,專案運行時選單欄自動生成
三、創建資料庫
創建資料庫表,MenuId是選單序號,MenuName為TreeView顯示的頁面名稱,MenuCode為Tag,ParentId為該子節點的根節點

四、撰寫代碼自動生成
按照兩層架構來完成

物體類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即可使用

五、后期修改完善
以后修改選單,只需在資料庫中增刪改即可,不必每次都重新匯入控制元件,
并且這個控制元件只需要開發一次,就可以重復的匯入不同的專案中,只需在資料庫中配置選單資訊即可,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/207929.html
標籤:.NET技术
