小妹真诚求教!TreeView如何设计无级菜单和展现菜单!
我想做一个无级菜单!结构如下,我不会设计数据库!请师哥们帮忙!
再有数据库设计好之后,如何取出数据显现在TreeView控件上!
谢谢各位师哥了!
中国
|—北京市
|—天津市
|—上海市
|—河北省
|—石家庄市
|—XX县
|—邯郸市
|—河南省
|—郑州市
|—新乡市
|—广东省
|—广州市
|—深圳市
|—XX县
谢谢各位师哥!请代码明示!C#!小妹我在这里不胜感激!
[解决办法]
在数据库中建一个表:如下! PID说父接点意思
ID PID Name Url
标识 父标识 名字 链接
如:
1 0 中国 #
2 1 河北省 #
连接数据库后的绑定代码:BindTree(this.TreeView1.Nodes, 0);//this.TreeView1就是你的TreeView控件
类
void BindTree(TreeNodeCollection nds, int parentId)
{
TreeNode tn = null;
foreach (DataRow dr in BLL.DO.TreeviewItem().Select( "PId= " + parentId, "ListID asc "))
{
tn = new TreeNode(dr[ "Name "].ToString(), dr[ "id "].ToString(), null, dr[ "Url "].ToString(), "fmain ");
//tn.ShowCheckBox = true;
nds.Add(tn);
BindTree(tn.ChildNodes, Convert.ToInt32(dr[ "id "]));
}
}
不明白再问我,记得给分^_^ !
[解决办法]
结构
bh name parent
1001 广东
100101 广州 1001
100102 中山 1001
10010201 古镇 100102
Dim dtconn As SqlConnection = New SqlConnection( "data source=.;uid=sa;pwd=aaaaaa;database=tree; ")
Dim dtcmd As SqlCommand
Dim dtreader As SqlDataReader
Dim dtcm As SqlCommand
Dim dtread As SqlDataReader
Dim dtSql As String = "select * from tree order by bh "
dtcmd = New SqlCommand(dtSql, dtconn)
dtconn.Open()
dtreader = dtcmd.ExecuteReader()
While dtreader.Read
Dim root As New TreeNode
root.Text = dtreader( "mc ")
root.Value = dtreader( "bh ")
If dtreader( "parent ") = " " Then
TreeView1.Nodes.Add(root)
End If
FillTree(root)
End While
dtreader.Close()
Sub FillTree(ByVal root As TreeNode)
Dim dtconn As SqlConnection = New SqlConnection( "data source=.;uid=sa;pwd=aaaaaa;database=tree; ")
Dim dtcmd As SqlCommand
Dim dtreader As SqlDataReader
Dim dtSql As String = "select * from tree where parent= ' " + root.Value + " ' "
dtcmd = New SqlCommand(dtSql, dtconn)
dtconn.Open()
dtreader = dtcmd.ExecuteReader()
While dtreader.Read
Dim childroot As New TreeNode
childroot.Text = dtreader( "mc ")
childroot.Value = dtreader( "bh ")
root.ChildNodes.Add(childroot)
FillTree(childroot)
End While
dtreader.Close()
dtconn.Close()
End Sub
[解决办法]
我的数据库设计是
ID PID NAME ListID Url
其中ListID是用来排序的!呵呵
如:
你可以给几个省排序!
[解决办法]
#region 填充树节点
/// <summary>
/// 填充树节点
/// </summary>
/// <param name= "tid "> </param>
/// <param name= "team "> </param>
/// <param name= "task "> </param>
/// <param name= "c "> </param>
static void FillTreeView(string tid,ref DataTable team,ref DataTable task,TreeNodeCollection c)
{
DataRow[] teamRows = team.Select( "ParentID= " + tid);//搜索所有任务组
DataRow[] taskRows = task.Select( "TaskTeamID= " + tid);//搜索所有任务
int l = teamRows.Length;
//加载子分组
for(int i = 0 ; i < l ; ++i)
{
TreeNode n = new TreeNode(teamRows[i][2].ToString(),0,0);
n.Tag = teamRows[i][0];
c.Add(n);
CKlTree.FillTreeView(n.Tag.ToString(),ref team,ref task,n.Nodes);
}
//加载所有任务
l = taskRows.Length;
for(int i = 0 ; i < l ; ++i)
{
TreeNode n = new TreeNode(taskRows[i][2].ToString(),2,2);
n.Tag = taskRows[i][0];
c.Add(n);
}
}
#endregion
[解决办法]
算了,帮你修改成完整代码,希望你能看得明白
数据表
ID PID CName
注:
PID:父ID,例如武汉属于湖北,则数据库代码如下
1 0 湖北
2 1 武汉
CName:城市名称
#region 填充树节点
/// <summary>
/// 填充树节点
/// </summary>
/// <param name= "tid "> 父ID </param>
/// <param name= "team "> 父数据表 </param>
/// <param name= "c "> 父节点集合 </param>
static void FillTreeView(string tid,ref DataTable team,TreeNodeCollection c)
{
DataRow[] teamRows = team.Select( "PID= " + tid);//搜索所有子组
int l = teamRows.Length;
//加载子分组
for(int i = 0 ; i < l ; ++i)
{
TreeNode n = new TreeNode(teamRows[i][2].ToString(),0,0);
c.Add(n);
CKlTree.FillTreeView(teamRows[i][0].ToString(),ref team,n.Nodes);
}
}
#endregion
[解决办法]
算了,帮你修改成完整代码,希望你能看得明白
数据表
ID PID CName
注:
PID:父ID,例如武汉属于湖北,则数据库代码如下
1 0 湖北
2 1 武汉
CName:城市名称
#region 填充树节点
/// <summary>
/// 填充树节点
/// </summary>
/// <param name= "tid "> 父ID </param>
/// <param name= "team "> 父数据表 </param>
/// <param name= "c "> 父节点集合 </param>
static void FillTreeView(string tid,ref DataTable team,TreeNodeCollection c)
{
DataRow[] teamRows = team.Select( "PID= " + tid);//搜索所有子组
int l = teamRows.Length;
//加载子分组
for(int i = 0 ; i < l ; ++i)
{
TreeNode n = new TreeNode(teamRows[i][2].ToString(),0,0);
c.Add(n);
CKlTree.FillTreeView(teamRows[i][0].ToString(),ref team,n.Nodes);
}
}
#endregion
[解决办法]
Dim dtconn As SqlConnection = New SqlConnection( "data source=.;uid=sa;pwd=aaaaaa;database=tree; ")
Dim dtcmd As SqlCommand
Dim dtreader As SqlDataReader
Dim dtcm As SqlCommand
Dim dtread As SqlDataReader
Dim dtSql As String = "select * from tree order by bh "
dtcmd = New SqlCommand(dtSql, dtconn)
dtconn.Open()
dtreader = dtcmd.ExecuteReader()
While dtreader.Read
Dim root As New TreeNode
root.Text = dtreader( "mc ")
root.Value = dtreader( "bh ")
If dtreader( "parent ") = " " Then
TreeView1.Nodes.Add(root)
End If
FillTree(root)
End While
dtreader.Close()
Sub FillTree(ByVal root As TreeNode)
Dim dtconn As SqlConnection = New SqlConnection( "data source=.;uid=sa;pwd=aaaaaa;database=tree; ")
Dim dtcmd As SqlCommand
Dim dtreader As SqlDataReader
Dim dtSql As String = "select * from tree where parent= ' " + root.Value + " ' "
dtcmd = New SqlCommand(dtSql, dtconn)
dtconn.Open()
dtreader = dtcmd.ExecuteReader()
While dtreader.Read
Dim childroot As New TreeNode
childroot.Text = dtreader( "mc ")
childroot.Value = dtreader( "bh ")
root.ChildNodes.Add(childroot)
FillTree(childroot)
End While
dtreader.Close()
dtconn.Close()
End Sub
[解决办法]
这个就是一个递归啊....
http://blog.csdn.net/YUAN168/archive/2007/06/14/1651405.aspx
=============================代码如下:
数据库结构:id,name,parentid
//采用递归的方法动态建立Tree
private void CreateTree(TreeNodeCollection Nds, int parentID)
{
DataView dv = new DataView(dtMaster);
TreeNode tmpNd;
int intID;
dv.RowFilter = "parentid= ' " + parentID + " ' ";
foreach (DataRowView drv in dv)
{
intID = Convert.ToInt16(drv[ "nodeid "]);
tmpNd = new TreeNode();
tmpNd.Name = drv[ "nodeid "].ToString();
tmpNd.Text = drv[ "nodename "].ToString();
Nds.Add(tmpNd);
CreateTree(Nds[Nds.Count - 1].Nodes, intID);
}
}
private void frmNodeConfig_Load(object sender, EventArgs e)
{
FillDate();
this.trvMain.Nodes.Clear();
CreateTree(trvMain.Nodes, 0);
trvMain.Nodes[0].Expand();
}