日期:2014-05-17  浏览次数:20578 次

我搞了一天了,treeview问题,高手们睡了没有,进来看看!
原来我的数据库中的结构是这样的:
class表:

C_id           ParentsId           C_class      
1                 0                           软件工程
2                 0                           网络编程
3                 0                           C#程序设计
4                 1                           第一章
5                 1                           第二章
6                 2                           第一章
7                 2                           第二章
8                 2                           第三章
9                 3                           第一章
10               3                           第二章

用TreeView控件绑定   想使之效果为:第一级节点显示课程的名称   然后他们下面可以展开他们的章节,比如软件工程有   第一章   第二章   ;网络编程有   第一章   第二章   第三章   。上面这样的数据库结构配合下面的程序,可以实现这个效果。
private   void   Page_Load(object   sender,   System.EventArgs   e)
{
if(!Page.IsPostBack)
{
string   SqlConn=System.Configuration.ConfigurationSettings.AppSettings[ "ConnString "];
Conn=new   SqlConnection(SqlConn);
CreateDataSet();
InitTree(this.TreeView1.Nodes, "0 ");
}
private   DataSet   CreateDataSet()
{
SqlStr= "select   *   from   class ";
da=new   SqlDataAdapter(SqlStr,Conn);
data=new   DataSet();
da.Fill(data, "tree ");
return   data;
}
private   void   InitTree(TreeNodeCollection   Nds,string   parentId)
{
TreeNode   tmpNd;
DataRow[]   rows=data.Tables[0].Select( "ParentId= ' "+parentId+ " ' ");
foreach(DataRow   row   in   rows)
{
tmpNd=new   TreeNode();
tmpNd.ID=row[ "C_id "].ToString();
tmpNd.Text=row[ "C_class "].ToString();
tmpNd.NavigateUrl= "index.aspx?class= "+row[ "parentId "].ToString()+ "&C_id= "+row[ "C_id "].ToString();
Nds.Add(tmpNd);
InitTree(tmpNd.Nodes,tmpNd.ID);
}
}
这样做主要思想是,先从表里找出根节点的数据,然后生成TreeNode节点插入到TreeView中,然后用第归寻找当前节点的子节点,生成TreeNode并插入到TreeView中。这样做是可以的。
但我想从新设计一下数据库,让它更容易理解些。我想做成这样:
C_id           NodeId           C_class      
1