数据库的表数据如何加入到TREEVIEW控件中?
如这样的表:
名称 节点号
A省营销中心 01
A市中心 0101
B市中心 0102
C市中心 0103
A市A区 010101
C市A区 010301
B省营销中心 02
A市中心 0201
B市中心 0202
B市A区 0201
。。。 。。。
这样的表不知何根据‘节点号’加入到TREEVIEW控件中?大家帮一把!
问题点数:10、回复次数:17Top
1 楼aw_921(aw)回复于 2005-02-01 15:35:08 得分 0
我也想知道呀Top
2 楼rachy(黑色雨)回复于 2005-02-01 15:47:50 得分 2
生成树一般来说有两种方法,一种是深度优先搜索,一种是广度优先搜索
深度搜索如下:用方法递归得到所有节点
private void FullTreeList(TreeNode ParentNode,int ParentKey)
{
int iDepID=0;
int iParentID=0;
foreach(DataRow dr in this.dtDep.Rows)
{
iDepID=int.Parse(dr["ID"].ToString ());
iParentID=int.Parse(dr["UpperID"].ToString());
if(iParentID ==ParentKey)
{
TreeNode mNode=new TreeNode();
mNode.Text=dr["DepartmentName"].ToString() ;
mNode.Tag=iDepID;
mNode.Expand();
ParentNode.Nodes.Add(mNode);
//find his children
FullTreeList(mNode,(int)mNode.Tag);
}
}
}Top
3 楼zjh135(aaa)回复于 2005-02-01 16:38:40 得分 0
TO RACHY:
我还是没有懂你的意思,能不能详细一点啊,谢谢!!Top
4 楼yuhan0001(雨涵)回复于 2005-02-01 17:04:46 得分 0
你可以先把数据生成XML格式,这样就非常好加入了Top
5 楼zjh135(aaa)回复于 2005-02-01 17:09:53 得分 0
TO RACHY:
int ParentKey,这个参数是什么啊?
TO YUHAN0001;
能给个代码吗?Top
6 楼JafyLiu(自由的代价)回复于 2005-02-01 17:23:36 得分 1
数据循环内嵌套树的遍历(递归)。思路是,把数据一条条nodes.add到树上的合适位置。Top
7 楼JafyLiu(自由的代价)回复于 2005-02-01 17:26:26 得分 1
取数据时要记得排序,不然子来了找不到父。Top
8 楼renshenwawa397(人参娃娃)回复于 2005-02-02 09:03:01 得分 1
用递归是最好的方法!Top
9 楼douguangyao(咦,有间客栈!)回复于 2005-02-02 10:02:25 得分 1
Imports System
Imports System.Collections
Imports System.ComponentModel
Imports System.Data
Imports System.Web
Imports System.Web.SessionState
Imports System.Web.UI
Imports System.Web.UI.HtmlControls
Imports System.Web.UI.WebControls
Imports System.Data.SqlClient
Imports System.Configuration
Imports Microsoft.Web.UI.WebControls
Dim conn As New SqlConnection
Dim mycmd As New SqlDataAdapter
Dim ds As DataSet
Dim cmdSelect As String
Protected WithEvents TVMenu As Microsoft.Web.UI.WebControls.TreeView
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'在此处放置初始化页的用户代码
conn = New SqlConnection(ConfigurationSettings.AppSettings("SQLConnString1"))
'conn.ConnectionString = Application("SQLConnString1")
CreateDataSet()
InitTree(TVMenu.Nodes, "0")
End Sub
Private Function CreateDataSet() As DataSet
cmdSelect = "select * from S_Menu"
mycmd = New SqlDataAdapter(cmdSelect, conn)
ds = New DataSet
mycmd.Fill(ds, "s_menu")
Return ds
End Function
Private Sub InitTree(ByVal Nds As TreeNodeCollection, ByVal parentId As String)
Dim dv As New DataView
Dim tmpNd As TreeNode
Dim intId As String
Dim drv As DataRowView
dv.Table = ds.Tables("tree")
dv.RowFilter = "ParentId='" + parentId + "'"
For Each drv In dv
tmpNd = New TreeNode
tmpNd.ID = drv("NodeId").ToString()
tmpNd.Text = drv("NodeName").ToString()
tmpNd.ImageUrl = "../images/" + drv("Icon").ToString()
tmpNd.NavigateUrl = "../" + drv("Address").ToString()
Nds.Add(tmpNd)
intId = drv("ParentId").ToString()
InitTree(tmpNd.Nodes, tmpNd.ID)
Next
End Sub
Top
10 楼douguangyao(咦,有间客栈!)回复于 2005-02-02 10:03:49 得分 0
不知道为什么程序执行到For Each 语句的时候
不执行下面的,直接跳到next,
共同关注!!!!Top
11 楼zjh135(aaa)回复于 2005-02-02 11:06:41 得分 0
// 递归添加树的节点
public void AddTree(int ParentID,TreeNode pNode)
{
DataView dvTree = new DataView(ds.Tables[0]);
//过滤ParentID,得到当前的所有子节点
string Fstr= "[PARENTID] = " + ParentID;//
dvTree.RowFilter = Fstr;
MessageBox.Show(Fstr);
foreach(DataRowView Row in dvTree)
{
if(pNode == null)
{ //'̀添加根节点
TreeNode Node = treeView1.Nodes.Add(Row["ConText"].ToString());
AddTree(Int32.Parse(Row["ID"].ToString()),Node); //再次递归
}
else
{ //添加当前节点的子节点
TreeNode Node = pNode.Nodes.Add(Row["ConText"].ToString());
AddTree(Int32.Parse(Row["ID"].ToString()),Node); //再次递归
}
}
}
我找到一些代码,这个代码不好理解?大家帮一下Top
12 楼douguangyao(咦,有间客栈!)回复于 2005-02-02 11:16:20 得分 2
private void InitTree(TreeNodeCollection Nds,string parentId)
{
DataView dv=new DataView();
TreeNode tmpNd;
string intId;
dv.Table=ds.Tables["S_Menu"];
dv.RowFilter="ParentId='" + parentId + "'" ;
foreach(DataRowView drv in dv)
{
tmpNd=new TreeNode();
tmpNd.ID=drv["NodeId"].ToString();
tmpNd.Text=drv["NodeName"].ToString();
tmpNd.ImageUrl="../images/"+drv["Icon"].ToString();
tmpNd.NavigateUrl="../"+drv["Address"].ToString();
Nds.Add(tmpNd);
intId=drv["ParentId"].ToString();
InitTree(tmpNd.Nodes,tmpNd.ID);
}
}
我想问问大家,为什么我的程序执行到foreach的时候就跳出来阿
快帮帮忙Top
13 楼douguangyao(咦,有间客栈!)回复于 2005-02-03 09:51:35 得分 1
我知道了,
dv.RowFilter="ParentId='" + parentId + "'" ;
这句多了两个单引号,
楼主你的弄好了没阿Top
14 楼zjh135(aaa)回复于 2005-02-03 10:29:46 得分 0
TO:douguangyao
怎么用你的InitTree这个过程啊??对于递归有点不明白Top
15 楼zjh135(aaa)回复于 2005-02-03 10:36:39 得分 0
dv.RowFilter="ParentId='" + parentId + "'" ;
这句的过滤条件在执行时不能确定是那一层次的NODE,唉。。。Top
16 楼zjh135(aaa)回复于 2005-02-03 10:40:42 得分 0
那位能把‘小学生’的代码,改为循环语名呢??Top
17 楼gatr()回复于 2005-02-03 11:06:46 得分 1
一个一个读出来再加到适当位置就可以了Top




