我搞了一天了,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