TreeView树形菜单无限级分类
以下实现的是一个树形菜单,每一级对应一类窗口,点击叶子节点时弹出新的窗口;
用递归和委托实现的。
第一部分功能-创建树形菜单(摘自wowait2博客):
1 /// <summary> 2 /// 创建树形菜单 3 /// </summary> 4 public void AddTree(int ParentID, TreeNode pNode) 5 { 6 // 数据库名字字段 7 string strName = "Name"; 8 // 数据库ID字段 9 string strID = "ID"; 10 // 数据库父级ID字段 11 string strParentID = "ParentID"; 12 DataTable dt = typeManager.GetAllList(); 13 DataView dvTree = new DataView(dt); 14 dvTree.RowFilter = strParentID + " = " + ParentID; 15 foreach (DataRowView Row in dvTree) 16 { 17 TreeNode Node = new TreeNode(); 18 if (pNode == null) 19 { 20 Node.Text = Row[strName].ToString(); 21 Node.Name = Row[strName].ToString(); 22 Node.Tag = Row[strID].ToString(); 23 Node.ImageIndex = 1; 24 this.treeView1.Nodes.Add(Node); 25 AddTree(Int32.Parse(Row[strID].ToString()), Node); //再次递归 26 } 27 else 28 { 29 Node.Text = Row[strName].ToString(); 30 Node.Name = Row[strName].ToString(); 31 Node.Tag = Row[strID].ToString(); 32 Node.ImageIndex = 1; 33 pNode.Nodes.Add(Node); 34 AddTree(Int32.Parse(Row[strID].ToString()), Node); //再次递归 35 } 36 } 37 } 38 39 /// <summary> 40 /// 主窗体加载 41 /// </summary> 42 /// <param name="sender"></param> 43 /// <param name="e"></param> 44 private void frmTree_Load(object sender, EventArgs e) 45 { 46 // 根节点ID值 47 int i = 0; 48 this.treeView1.Nodes.Clear(); 49 AddTree(i, (TreeNode)null); 50 treeView1.HideSelection = true; 51 treeView1.ShowLines = true; 52 }
第二部分功能-文件夹图标变换:
1 private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) 2 { 3 ImageChange(e); 4 } 5 6 private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) 7 { 8 ImageChange(e); 9 } 10 /// <summary> 11 /// 变换文件夹图标 12 /// </summary> 13 /// <param name="e"></param> 14 public void ImageChange(TreeNodeMouseClickEventArgs e) 15 { 16 if (null == e.Node.FirstNode) 17 { 18 e.Node.ImageIndex = 0; 19 e.Node.SelectedImageIndex = 0; 20 } 21 else 22 { 23 if (e.Node.IsExpanded) 24 { 25 e.Node.ImageIndex = 0; 26 e.Node.SelectedImageIndex = 0; 27 } 28 else 29 { 30 e.Node.ImageIndex = 1; 31 e.Node.SelectedImageIndex = 1; 32 } 33 } 34 }
第三部分功能-委托打开新窗口:
1 delegate void Mydelegate(string name, string id); 2 Mydelegate md = null; 3 public frmTree() 4 { 5 InitializeComponent(); 6 } 7 /// <summary> 8 /// 打开新窗口 9 /// </summary> 10 /// <param name="sender"></param> 11 /// <param name="e"></param> 12 private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) 13 { 14 // 设置显示图标的变换 15 if(null== e.Node.FirstNode) 16 { 17 e.Node.ImageIndex = 1; 18 e.Node.SelectedImageIndex = 0; 19 } 20 // 打开新的窗口,每一级对应一类窗口 21 if (e.Node != null && null == e.Node.FirstNode) 22 { 23 string tag =e.Node.Tag.ToString(); 24 string name = e.Node.Text.ToString(); 25 switch(e.Node.Level) 26 { 27 case 0: 28 this.md= new Mydelegate(OpenForm1); 29 break; 30 case 1: 31 this.md = new Mydelegate(OpenForm2); 32 break; 33 case 2: 34 this.md = new Mydelegate(OpenForm3); 35 break; 36 } 37 md(name, tag); 38 } 39 } 40 /// <summary> 41 /// 打开新窗口 42 /// </summary> 43 /// <param name="name">传递参数</param> 44 /// <param name="id">传递参数</param> 45 public static void OpenForm1(string name,string id) 46 { 47 Form newForm = new Form1(); 48 newForm.ShowDialog(); 49 } 50 public static void OpenForm2(string name, string id) 51 { 52 Form newForm = new Form2(); 53 newForm.ShowDialog(); 54 } 55 public static void OpenForm3(string name, string id) 56 { 57 Form newForm = new Form3(); 58 newForm.ShowDialog(); 59 }