如何在C#中快速实现数据库树形结构 (sql2000)
能给出完整例子吗?含数据库文件的代码。
nextly@163.com
我是这样实现的:
我的数据库使用ACCESS
在数据库中有两个表,一个是代码表,一个代码类别表:
代码表的结构:
ID: 编号
Name: 名字
Categorized:代码的类别
代码类别表的结构:
ID: 编号
Name:名字
Parent:上层类
主要采用类似递归的方法:
还有使用到TAG 属性,用来记录点的一些必要的信息,
以下是代码,决绝了问题记得给我分。
public void LoadData()
{
treeView1.Nodes.Clear ();
string SqlCate="SELECT [ID],[Name],[Parent] FROM[Categorized] ORDER BY [Parent],[ID]";
mDs=Oper.GetResults(SqlCate);
string SqlCode="SELECT [ID],[Title],[Categorized] FROM [Code] ORDER BY [ID]";
mCodeDs=Oper.GetResults (SqlCode);
AddNoteOfParent(-1,null);
}
private void AddNoteOfParent(int IdParent,TreeNode PNode)
{
DataView dv=new DataView ( mDs.Tables [0]);
dv.RowFilter ="[Parent]=" +IdParent;
foreach(DataRowView rv in dv )
{
if (PNode==null)
{
TreeNode tn=new TreeNode (rv["Name"].ToString());
treeView1.Nodes.Add (tn);
AddNoteOfParent(int.Parse (rv["ID"].ToString ()),tn);
AddCodeNode(int.Parse (rv["ID"].ToString ()),tn);
}
else
{
TreeNode tn=new TreeNode (rv["Name"].ToString ());
PNode.Nodes.Add (tn);
CNodeItem ni=new CNodeItem ();
ni.ID =int.Parse (rv["ID"].ToString ());
ni.ItemType=NodeItemType.Categorize ;
tn.Tag =ni;
AddNoteOfParent(int.Parse (rv["ID"].ToString ()),tn);
AddCodeNode(int.Parse (rv["ID"].ToString ()),tn);
}
}
}
private void AddCodeNode(int IdParent,TreeNode PNode)
{
DataView codedv=new DataView ( mCodeDs.Tables [0]);
codedv.RowFilter ="[Categorized]=" + IdParent.ToString ();
foreach(DataRowView rv in codedv)
{
TreeNode tn=new TreeNode (rv["Title"].ToString ());
CNodeItem ni=new CNodeItem ();
ni.ID =int.Parse (rv["ID"].ToString ());
ni.ItemType =NodeItemType.Code ;
tn.Tag=ni;
PNode.Nodes.Add (tn);
}
}
private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
TreeNode tn=treeView1.SelectedNode ;
if (tn.Tag==null) return;
CNodeItem ni=(CNodeItem) tn.Tag ;
string SqlStr="";
if (ni.ItemType !=NodeItemType.Categorize )
{
SqlStr="SELECT * FROM [Code] WHERE [ID]=" +ni.ID.ToString ();
DataSet ds=Oper.GetResults (SqlStr);
DataTable dt=ds.Tables [0];
if (dt.Rows.Count ==1)
{
DataRow dr=dt.Rows [0];
labTitle.Text ="标题:"+tn.Text ;
txtNote.Text =dr["Note"].ToString ();
txtCode.Text =dr["Content"].ToString ();
mCurrentCode.Title =dr["Title"].ToString ();
mCurrentCode.Categorized =int.Parse (dr["Categorized"].ToString ());
mCurrentCode.Content =dr["Content"].ToString ();
mCurrentCode.KeyWord =dr["Keyword"].ToString ();
mCurrentCode.Note =dr["Note"].ToString ();
mCurrentCode.Relationship =dr["Relationship"].ToString ();
}
}
else
{
SqlStr="SELECT * FROM [Categorized] WHERE [ID]=" +ni.ID.ToString ();
DataSet ds=Oper.GetResults (SqlStr);
DataTable dt=ds.Tables [0];
if (dt.Rows.Count ==1)
{
DataRow dr=dt.Rows [0];
mCurrentCate.Id =int.Parse (dr["ID"].ToString ());
mCurrentCate.Name =dr["Name"].ToString ();
mCurrentCate.Note =dr["Note"].ToString ();
mCurrentCate.Parent =int.Parse (dr["Parent"].ToString ());
}//end if
}//end if
}