早上一上班,开电脑查看Email,看到博客园管理员回复的Blog地址修改成功的Email[我原先的Blog地址是ljun,因很久没回园子了现在重回园子想以新面孔来见大家^_^,故昨天下午14:20点左右向博客园管理员申请将其改为asidy],心情异常激动,一看时间是昨天下午17:48:40回复的Email,让我不由的惊叹修改之快!当然这少不了博客园管理员的支持,故在此表示感谢!好了,闲话就先到此吧,趁着午休先晒点出来先……哈哈~~第一步:创建数据库表
早上一上班,开电脑查看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
1
class DbBuild
2
{
3
private 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
1
class 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
38
dataSource, 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
56
Convert.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
68
nodes)
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
96
DataTable 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
114
Convert.ToInt32(node.Tag));
115
}
116
}
第四步:调用方法

Code
1
MethodOperate method = new MethodOperate();//实例化方法操作对象,用于基本的操作
2
string MenuSql = "Select * From Me_Menu Where Menu_Visble=1 Order by Menu_Order";//栏目查询
3
4
method.CreateTreeView(MenuSql, Menu_TV.Items);
<完毕>