动态Treeview,新闻快客。。求高手 怎么生成动态TreeView .求简单实例。。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 //从网上摘录的,第一级可以按照下面的方法绑定,以后的级别可以写一个递归调用函数就可以了!下面的仅供参考,至于递归函数怎么写,自己看看,研究一下吧...关于VS2005中TreeView控件动态绑定数据库由于一直做Web开发,对于TreeView这个控件用的比较少,今天在做桌面应用程序的时候,遇到了这个控件,项目中的需求是需要分三级,动态从数据库中绑定,下面是我实现的方法,供大家参考第一级 private void BindTree() { DataSet ds = new DataSet(); string sql = "select * from Address"; ds = adb.getDataSet(sql, "Address"); foreach (DataRow dr in ds.Tables[0].Rows) { TreeNode tn = new TreeNode(); tn.Text =dr["AddressID"].ToString()+" "+ dr["AddressName"].ToString(); //根据需求要帮你数据库中的两列 tn.Value = dr["AddressID"].ToString(); TreeView1.Nodes[0].ChildNodes.Add(tn); BandingAddressOne(tn); //第二级的方法 } }第二级 public void BandingAddressOne(TreeNode node) { int id = Convert.ToInt32(node.Value); DataSet ds = new DataSet(); string sql = string.Format("select * from AddressOne where AddressID={0}", id); ds = adb.getDataSet(sql, "AddressOne"); foreach (DataRow dr in ds.Tables["AddressOne"].Rows) { TreeNode tn = new TreeNode(); tn.Text =dr["AddressOneID"].ToString()+" "+ dr["AddressOneName"].ToString(); tn.Value = dr["AddressOneID"].ToString(); node.ChildNodes.Add(tn);//在这个地方我一开始遇到了一个问题,就是之前写的是 TreeView1.Nodes//[0].ChildNodes.Add(tn); 而这样出现的结果是,当我点击第一级,也就是根的时候,本来要绑定的第二级也成了第一级,当我多次点击的时候,就会循环的绑定。 BandingAddressTwo(tn); } }第三级 public void BandingAddressTwo(TreeNode node) { int id = Convert.ToInt32(node.Value); DataSet ds = new DataSet(); string sql = string.Format("select * from AddressTwo where AddressOneID={0}", id); ds = adb.getDataSet(sql, "AddressTwo"); foreach (DataRow dr in ds.Tables["AddressTwo"].Rows) { TreeNode tn = new TreeNode(); tn.Text =dr["AddressTwoID"].ToString()+" "+ dr["AddressTwoName"].ToString(); tn.Value = dr["AddressTwoID"].ToString(); node.ChildNodes.Add(tn); } }通过这三级,我发现,它们每次绑定的方法差不多,只是在每一级的方法中调用下一级的方法,做为它的枝或者叶 怎么用到dataset了?需要引用命名空间吗? 递归……数据库:NodeId ParentId NodeName 1 0 1 2 1 1.1 3 1 1.2 4 3 1.2.1 5 3 1.2.2 6 0 2……<%@ Page Language="C#" %><%@ Import Namespace="System.Data" %><%@ Import Namespace="System.Data.SqlClient" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><script runat="server"> protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack){ CreateTreeView(); } } /// <summary> /// 创建 TreeView /// 此方法采取一次性加载目标数据到 DataTable,递归查询 DataTable ,创建子节点 /// </summary> private void CreateTreeView() { //虚拟的根节点 ID, 表中 ParentID=0 的节点表示无实际父节点 const int VirtualRootId = 0; const string SQL_SELECT = "SELECT NodeId, NodeName,ParentId FROM TreeView ORDER BY NodeId ASC"; string connStr = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString; SqlDataAdapter da = new SqlDataAdapter(SQL_SELECT, new SqlConnection(connStr)); DataTable dt = new DataTable(); da.Fill(dt); CreateTreeViewRecursive(treeMenu.Nodes, dt, 0); } /// <summary> /// 递归查询数据,创建 TreeNode 节点 /// </summary> /// <param name="nodes"></param> /// <param name="dataSource"></param> /// <param name="parentId"></param> private void CreateTreeViewRecursive(TreeNodeCollection nodes, DataTable dataSource, int parentId) { // string fliter = String.Format("ParentId={0}", parentId); // 查询子节点 DataRow[] drArr = dataSource.Select(fliter); TreeNode node; foreach(DataRow dr in drArr) { node = new TreeNode(); nodes.Add(node); node.Text = (string)dr["NodeName"]; // 设置其他属性 // 递归创建子节点 CreateTreeViewRecursive(node.ChildNodes, dataSource,Int32.Parse(dr["NodeId"].ToString())); // 移除已添加行,提高性能 dataSource.Rows.Remove(dr); } }</script><html xmlns="http://www.w3.org/1999/xhtml" ><head id="Head1" runat="server"> <title>ASP.NET DEMO15: CreateTreeViewResursiveFromDb</title></head><body> <form id="form1" runat="server"> <div> <h1>Menu Tree created from DataBase</h1> <a href="http://www.cnblogs.com/Jinglecat/archive/2007/08/10/850090.html">More Details</a> <hr /> <asp:TreeView ID="treeMenu" runat="server" ExpandDepth="1"> </asp:TreeView> </div> </form></body></html> 如果Button被Disable了,如何显示Tooltip 0行没有任何数据 关于2个用户自定义控件之间传值的问题! 请问怎样用C#控制读取智能卡上的数据 如SD卡 手机卡 等` 在C#中一个记录集采用了两表连接的查询,请问怎样更新到数据库 求用GPRS猫实现短信收发的方法 关于对cache中数据的修改问题。好郁闷哦。把整个设计都打乱了。~~~~~求救啊。 图像重画时出现的问题 求一个简单算法 C#里面调用C++的方法识别人的拳头 C# 用OleDbDataAdapter 和DataSet 更新多条记录 sql查询出错
由于一直做Web开发,对于TreeView这个控件用的比较少,今天在做桌面应用程序的时候,遇到了这个控件,项目中的需求是需要分三级,动态从数据库中绑定,下面是我实现的方法,供大家参考第一级 private void BindTree()
{
DataSet ds = new DataSet();
string sql = "select * from Address";
ds = adb.getDataSet(sql, "Address");
foreach (DataRow dr in ds.Tables[0].Rows)
{ TreeNode tn = new TreeNode();
tn.Text =dr["AddressID"].ToString()+" "+ dr["AddressName"].ToString(); //根据需求要帮你数据库中的两列
tn.Value = dr["AddressID"].ToString();
TreeView1.Nodes[0].ChildNodes.Add(tn);
BandingAddressOne(tn); //第二级的方法
}
}第二级 public void BandingAddressOne(TreeNode node)
{
int id = Convert.ToInt32(node.Value);
DataSet ds = new DataSet();
string sql = string.Format("select * from AddressOne where AddressID={0}", id);
ds = adb.getDataSet(sql, "AddressOne");
foreach (DataRow dr in ds.Tables["AddressOne"].Rows)
{
TreeNode tn = new TreeNode();
tn.Text =dr["AddressOneID"].ToString()+" "+ dr["AddressOneName"].ToString();
tn.Value = dr["AddressOneID"].ToString();
node.ChildNodes.Add(tn);//在这个地方我一开始遇到了一个问题,就是之前写的是 TreeView1.Nodes//[0].ChildNodes.Add(tn); 而这样出现的结果是,当我点击第一级,也就是根的时候,本来要绑定的第二级也成了第一级,当我多次点击的时候,就会循环的绑定。
BandingAddressTwo(tn);
}
}第三级 public void BandingAddressTwo(TreeNode node)
{
int id = Convert.ToInt32(node.Value);
DataSet ds = new DataSet();
string sql = string.Format("select * from AddressTwo where AddressOneID={0}", id);
ds = adb.getDataSet(sql, "AddressTwo");
foreach (DataRow dr in ds.Tables["AddressTwo"].Rows)
{
TreeNode tn = new TreeNode();
tn.Text =dr["AddressTwoID"].ToString()+" "+ dr["AddressTwoName"].ToString();
tn.Value = dr["AddressTwoID"].ToString();
node.ChildNodes.Add(tn);
}
}通过这三级,我发现,它们每次绑定的方法差不多,只是在每一级的方法中调用下一级的方法,做为它的枝或者叶
NodeId ParentId NodeName
1 0 1
2 1 1.1
3 1 1.2
4 3 1.2.1
5 3 1.2.2
6 0 2
……
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack){
CreateTreeView();
}
} /// <summary>
/// 创建 TreeView
/// 此方法采取一次性加载目标数据到 DataTable,递归查询 DataTable ,创建子节点
/// </summary>
private void CreateTreeView()
{
//虚拟的根节点 ID, 表中 ParentID=0 的节点表示无实际父节点
const int VirtualRootId = 0;
const string SQL_SELECT = "SELECT NodeId, NodeName,ParentId FROM TreeView ORDER BY NodeId ASC";
string connStr = ConfigurationManager.ConnectionStrings["conStr"].ConnectionString;
SqlDataAdapter da = new SqlDataAdapter(SQL_SELECT, new SqlConnection(connStr));
DataTable dt = new DataTable();
da.Fill(dt);
CreateTreeViewRecursive(treeMenu.Nodes, dt, 0);
} /// <summary>
/// 递归查询数据,创建 TreeNode 节点
/// </summary>
/// <param name="nodes"></param>
/// <param name="dataSource"></param>
/// <param name="parentId"></param>
private void CreateTreeViewRecursive(TreeNodeCollection nodes, DataTable dataSource, int parentId)
{
//
string fliter = String.Format("ParentId={0}", parentId);
// 查询子节点
DataRow[] drArr = dataSource.Select(fliter);
TreeNode node;
foreach(DataRow dr in drArr)
{
node = new TreeNode();
nodes.Add(node);
node.Text = (string)dr["NodeName"];
// 设置其他属性
// 递归创建子节点
CreateTreeViewRecursive(node.ChildNodes, dataSource,Int32.Parse(dr["NodeId"].ToString()));
// 移除已添加行,提高性能
dataSource.Rows.Remove(dr);
}
}</script><html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
<title>ASP.NET DEMO15: CreateTreeViewResursiveFromDb</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h1>Menu Tree created from DataBase</h1>
<a href="http://www.cnblogs.com/Jinglecat/archive/2007/08/10/850090.html">More Details</a>
<hr />
<asp:TreeView ID="treeMenu" runat="server" ExpandDepth="1">
</asp:TreeView>
</div>
</form>
</body>
</html>