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         }

 

 Demo下载

Demo自定义控件下载

posted on 2013-03-06 09:49  沸动  阅读(390)  评论(0)    收藏  举报

导航