WPF(Winform)中动态创建TreeView

来源:转载

早上一上班,开电脑查看Email,看到博客园管理员回复的Blog地址修改成功的Email[我原先的Blog地址是ljun,因很久没回园子了现在重回园子想以新面孔来见大家^_^,故昨天下午14:20点左右向博客园管理员申请将其改为asidy],心情异常激动,一看时间是昨天下午17:48:40回复的Email,让我不由的惊叹修改之快!当然这少不了博客园管理员的支持,故在此表示感谢!好了,闲话就先到此吧,趁着午休先晒点出来先……哈哈~~

注:以下只写实现过程,不对相关原理或理论做说明,如有疑问之处可与我联系或自己查阅相关资料

第一步:创建数据库表

Code
CREATE TABLE [dbo].[Me_Menu] (
    [Menu_Id] [int] IDENTITY (1, 1) NOT NULL ,/**//*节点ID*/
    [Menu_Name] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,/**//*要显示的名称*/
    [Menu_ParentId] [int] NOT NULL ,/**//*父节点ID*/
    [Menu_Order] [int] NULL ,/**//*排序用*/
    [Menu_Visble] [int] NOT NULL /**//*是否显示*/
) ON [PRIMARY]
GO
第二步:写数据读写方法类

Code
 1class DbBuild
 2    {
 3private SqlConnection db_conn;//定义数据库连接对象
 4        private SqlCommand db_cmd = new SqlCommand();//定义数据库操作命令对象
 5        private SqlDataAdapter db_adp;//定义数据适配器
 6        private DataSet db_ds;//定义数据表
 7        private SqlDataReader reader;
 8
 9        /**//// <summary>
10        /// 打开数据库连接
11        /// </summary>
12        public void OpenDbConn()
13        {
14            CheckDbConn();
15        }
16        /**//// <summary>
17        /// 检查数据库连接与否
18        /// </summary>
19        /// <returns></returns>
20        public bool CheckDbConn()
21        {
22            try
23            {
24                //实例化连接对象
25                db_conn = new SqlConnection("server=localhost;database=me_wyzx;integrated security=SSPI ");
26                db_cmd.Connection = db_conn;//初始化操作指令Data Source=localhost;Database=me_wyzx;User Id=medb;Pwd=me2008
27                db_conn.Open();//打开连接
28            }
29            catch (Exception)
30            {
31                return false;//连接数据库失败
32            }
33
34            return true;//连接成功
35        }
36        /**//// <summary>
37        /// 关闭数据库连接
38        /// </summary>
39        public void CloseDbConn()
40        {
41            if (db_conn.State == ConnectionState.Open)
42            {
43                db_conn.Close();//关闭数据库连接
44            }
45            db_conn.Dispose();//释放连接对象的资源
46            db_cmd.Dispose();//释放操作对象的资源
47        }
48        /**//// <summary>
49        /// 返一DATATABLE数据表集
50        /// </summary>
51        /// <param name="sqlText">传入的SQL语句</param>
52        /// <returns></returns>
53        public DataTable GetDbTable(string sqlText)
54        {
55            db_adp = new SqlDataAdapter();//实例化数据适配器与数据表集
56            db_ds = new DataSet();
57            db_ds.Clear();
58
59            try
60            {
61                OpenDbConn();//打开连接
62                db_cmd.CommandType = CommandType.Text;
63                db_cmd.CommandText = sqlText;
64                db_adp.SelectCommand = db_cmd;
65                db_adp.Fill(db_ds, "db_Table");
66            }
67            catch (Exception)
68            {
69            }
70            finally
71            {
72                db_adp.Dispose();//释放数据适配器的资源
73                CloseDbConn();//关闭数据库连接
74            }
75
76            return db_ds.Tables["db_Table"];//返回数据表集
77        }
第三步:创建动态读取的方法类

Code
  1class MethodOperate
  2    {
  3        DbBuild dbbuild = new DbBuild();//实例化数据库操作对象
  4        //WPF方法:
  5        /**//// <summary>
  6        /// 动态创建TreeView
  7        /// </summary>
  8        /// <param name="sqlText">传入的SQL语句</param>
  9        /// <param name="nodes">TreeView节点集</param>
 10        public void CreateTreeView(string sqlText, ItemCollection item)
 11        {
 12            try
 13            {
 14                DataTable dbTable = new DataTable();//实例化一个DataTable数
 15
 16据表对象
 17                
 18                dbTable = dbbuild.GetDbTable(sqlText);//返数据表
 19
 20                //将第一级菜单取出生成TreeView的节点,作为递归运算的入口递归
 21
 22查询出TreeView的所有节点数据
 23                CreateTreeViewRecursive(item, dbTable, 0);
 24            }
 25            catch (Exception tv_ex)
 26            {
 27                MessageBox.Show(tv_ex.Message);
 28            }
 29        }
 30        /**//// <summary>
 31        /// 递归查询
 32        /// </summary>
 33        /// <param name="items">TreeView节点集合</param>
 34        /// <param name="dataSource">数据源</param>
 35        /// <param name="parentid">上一级菜单节点标识码</param>
 36        public void CreateTreeViewRecursive(ItemCollection items, DataTable
 37
 38dataSource, int parentid)
 39        {
 40            string filter;//定义一个过滤器
 41            filter = string.Format("Menu_ParentId={0}", parentid);
 42
 43            DataRow[] drarr = dataSource.Select(filter);//将过滤的ID放入数
 44
 45组中
 46
 47            TreeViewItem tvitem;
 48            foreach (DataRow dr in drarr)//递归循环查询出数据
 49            {
 50                tvitem = new TreeViewItem();// TreeNode();
 51                tvitem.Header = dr["Menu_Name"].ToString();
 52                tvitem.Tag = Convert.ToInt32(dr["Menu_Id"]);
 53                items.Add(tvitem);//加入节点
 54                CreateTreeViewRecursive(tvitem.Items, dataSource,
 55
 56Convert.ToInt32(tvitem.Tag));
 57            }
 58        }
 59}
 60        //WINFORM方法:
 61        /**//// <summary>
 62        /// 动态创建TreeView
 63        /// </summary>
 64        /// <param name="sqlText">传入的SQL语句</param>
 65        /// <param name="nodes">TreeView节点集</param>
 66        public void CreateTreeView(string sqlText, TreeNodeCollection
 67
 68nodes)
 69        {
 70            try
 71            {
 72                DataTable dbTable = new DataTable();//实例化一个DataTable数
 73
 74据表对象
 75                
 76                dbTable = dbbuild.GetDbTable(sqlText);//返数据表
 77
 78                //将第一级菜单取出生成TreeView的节点,作为递归运算的入口递归
 79
 80查询出TreeView的所有节点数据
 81                CreateTreeViewRecursive(nodes, dbTable, 0);
 82            }
 83            catch (Exception tv_ex)
 84            {
 85                MessageBox.Show(tv_ex.Message);
 86            }
 87        }
 88        /**//// <summary>
 89        /// 递归查询
 90        /// </summary>
 91        /// <param name="nodes">TreeView节点集合</param>
 92        /// <param name="dataSource">数据源</param>
 93        /// <param name="parentid">上一级菜单节点标识码</param>
 94        public void CreateTreeViewRecursive(TreeNodeCollection nodes,
 95
 96DataTable dataSource, int parentid)
 97        {
 98            string filter;//定义一个过滤器
 99            filter = string.Format("Menu_ParentId={0}", parentid);
100
101            DataRow[] drarr = dataSource.Select(filter);//将过滤的ID放入数
102
103组中
104
105            TreeNode node;
106            foreach (DataRow dr in drarr)//递归循环查询出数据
107            {
108                node = new TreeNode();
109                node.Text = dr["Menu_Name"].ToString();
110                node.Tag = Convert.ToInt32(dr["Menu_Id"]);
111                nodes.Add(node);//加入节点
112                CreateTreeViewRecursive(node.Nodes, dataSource,
113
114Convert.ToInt32(node.Tag));
115            }
116        }
第四步:调用方法

Code
1MethodOperate method = new MethodOperate();//实例化方法操作对象,用于基本的操作

[1] [2] 下一页

分享给朋友:
您可能感兴趣的文章:
随机阅读: