早上一上班,开电脑查看Email,看到博客园管理员回复的Blog地址修改成功的Email[我原先的Blog地址是ljun,因很久没回园子了现在重回园子想以新面孔来见大家^_^,故昨天下午14:20点左右向博客园管理员申请将其改为asidy],心情异常激动,一看时间是昨天下午17:48:40回复的Email,让我不由的惊叹修改之快!当然这少不了博客园管理员的支持,故在此表示感谢!好了,闲话就先到此吧,趁着午休先晒点出来先……哈哈~~第一步:创建数据库表
早上一上班,开电脑查看Email,看到博客园管理员回复的Blog地址修改成功的Email[我原先的Blog地址是ljun,因很久没回园子了现在重回园子想以新面孔来见大家^_^,故昨天下午14:20点左右向博客园管理员申请将其改为asidy],心情异常激动,一看时间是昨天下午17:48:40回复的Email,让我不由的惊叹修改之快!当然这少不了博客园管理员的支持,故在此表示感谢!好了,闲话就先到此吧,趁着午休先晒点出来先……哈哈~~
注:以下只写实现过程,不对相关原理或理论做说明,如有疑问之处可与我联系或自己查阅相关资料
第一步:创建数据库表
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
CREATE TABLE [dbo].[Me_Menu] (
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
[Menu_Id] [int] IDENTITY (1, 1) NOT NULL ,/**//*节点ID*/
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
[Menu_Name] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,/**//*要显示的名称*/
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
[Menu_ParentId] [int] NOT NULL ,/**//*父节点ID*/
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
[Menu_Order] [int] NULL ,/**//*排序用*/
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
[Menu_Visble] [int] NOT NULL /**//*是否显示*/
) ON [PRIMARY]
GO
第二步:写数据读写方法类
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
1
class DbBuild
2![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
10
/// 打开数据库连接
11
/// </summary>
12
public void OpenDbConn()
13![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
14
CheckDbConn();
15
}
16![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
17
/// 检查数据库连接与否
18
/// </summary>
19
/// <returns></returns>
20
public bool CheckDbConn()
21![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
22
try
23![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
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![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
31
return false;//连接数据库失败
32
}
33![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
34
return true;//连接成功
35
}
36![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
37
/// 关闭数据库连接
38
/// </summary>
39
public void CloseDbConn()
40![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
41
if (db_conn.State == ConnectionState.Open)
42![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
43
db_conn.Close();//关闭数据库连接
44
}
45
db_conn.Dispose();//释放连接对象的资源
46
db_cmd.Dispose();//释放操作对象的资源
47
}
48![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
49
/// 返一DATATABLE数据表集
50
/// </summary>
51
/// <param name="sqlText">传入的SQL语句</param>
52
/// <returns></returns>
53
public DataTable GetDbTable(string sqlText)
54![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
55
db_adp = new SqlDataAdapter();//实例化数据适配器与数据表集
56
db_ds = new DataSet();
57
db_ds.Clear();
58![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
59
try
60![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
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![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
69
}
70
finally
71![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
72
db_adp.Dispose();//释放数据适配器的资源
73
CloseDbConn();//关闭数据库连接
74
}
75![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
76
return db_ds.Tables["db_Table"];//返回数据表集
77
}
第三步:创建动态读取的方法类
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
1
class MethodOperate
2![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
3
DbBuild dbbuild = new DbBuild();//实例化数据库操作对象
4
//WPF方法:
5![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <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![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
12
try
13![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
14
DataTable dbTable = new DataTable();//实例化一个DataTable数
15![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
16
据表对象
17
18
dbTable = dbbuild.GetDbTable(sqlText);//返数据表
19![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
20
//将第一级菜单取出生成TreeView的节点,作为递归运算的入口递归
21![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
22
查询出TreeView的所有节点数据
23
CreateTreeViewRecursive(item, dbTable, 0);
24
}
25
catch (Exception tv_ex)
26![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
27
MessageBox.Show(tv_ex.Message);
28
}
29
}
30![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
38
dataSource, int parentid)
39![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
40
string filter;//定义一个过滤器
41
filter = string.Format("Menu_ParentId={0}", parentid);
42![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
43
DataRow[] drarr = dataSource.Select(filter);//将过滤的ID放入数
44![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
45
组中
46
47
TreeViewItem tvitem;
48
foreach (DataRow dr in drarr)//递归循环查询出数据
49![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
56
Convert.ToInt32(tvitem.Tag));
57
}
58
}
59
}
60
//WINFORM方法:
61![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//// <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![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
68
nodes)
69![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
70
try
71![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
72
DataTable dbTable = new DataTable();//实例化一个DataTable数
73![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
74
据表对象
75
76
dbTable = dbbuild.GetDbTable(sqlText);//返数据表
77![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
78
//将第一级菜单取出生成TreeView的节点,作为递归运算的入口递归
79![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
80
查询出TreeView的所有节点数据
81
CreateTreeViewRecursive(nodes, dbTable, 0);
82
}
83
catch (Exception tv_ex)
84![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
85
MessageBox.Show(tv_ex.Message);
86
}
87
}
88![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
/**//// <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![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
96
DataTable dataSource, int parentid)
97![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
98
string filter;//定义一个过滤器
99
filter = string.Format("Menu_ParentId={0}", parentid);
100![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
101
DataRow[] drarr = dataSource.Select(filter);//将过滤的ID放入数
102![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
103
组中
104![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
105
TreeNode node;
106
foreach (DataRow dr in drarr)//递归循环查询出数据
107![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
114
Convert.ToInt32(node.Tag));
115
}
116
}
第四步:调用方法
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
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);
<完毕>