早上一上班,开电脑查看Email,看到博客园管理员回复的Blog地址修改成功的Email[我原先的Blog地址是ljun,因很久没回园子了现在重回园子想以新面孔来见大家^_^,故昨天下午14:20点左右向博客园管理员申请将其改为asidy],心情异常激动,一看时间是昨天下午17:48:40回复的Email,让我不由的惊叹修改之快!当然这少不了博客园管理员的支持,故在此表示感谢!好了,闲话就先到此吧,趁着午休先晒点出来先……哈哈~~第一步:创建数据库表
早上一上班,开电脑查看Email,看到博客园管理员回复的Blog地址修改成功的Email[我原先的Blog地址是ljun,因很久没回园子了现在重回园子想以新面孔来见大家^_^,故昨天下午14:20点左右向博客园管理员申请将其改为asidy],心情异常激动,一看时间是昨天下午17:48:40回复的Email,让我不由的惊叹修改之快!当然这少不了博客园管理员的支持,故在此表示感谢!好了,闲话就先到此吧,趁着午休先晒点出来先……哈哈~~
注:以下只写实现过程,不对相关原理或理论做说明,如有疑问之处可与我联系或自己查阅相关资料
第一步:创建数据库表
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第二步:写数据读写方法类
1
class DbBuild2

{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
try23

{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=me200827
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
try60

{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
finally71

{72
db_adp.Dispose();//释放数据适配器的资源73
CloseDbConn();//关闭数据库连接74
}75

76
return db_ds.Tables["db_Table"];//返回数据表集77
}第三步:创建动态读取的方法类
1
class MethodOperate2

{3
DbBuild dbbuild = new DbBuild();//实例化数据库操作对象4
//WPF方法:5

/**//// <summary>6
/// 动态创建TreeView7
/// </summary>8
/// <param name="sqlText">传入的SQL语句</param>9
/// <param name="nodes">TreeView节点集</param>10
public void CreateTreeView(string sqlText, ItemCollection item) 11

{12
try13

{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
/// 动态创建TreeView63
/// </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
try71

{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
}第四步:调用方法
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);<完毕>
浙公网安备 33010602011771号