早上一上班,开电脑查看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();//实例化方法操作对象,用于基本的操作