方法一:

本文轉載:http:
//
dengzebo.blog.163.com/blog/static/18867406201032141742168/
#region "讀取樹結點從Datatable"
/// <summary>
/// 讀取樹結點從Datatable"
/// </summary>
/// <param name="TreeView1"> 在填充的TreeView控件 </param>
/// <param name="DT"> 數據源DataTable </param>
/// <param name="IsAppendNode"> 是在現有TreeView控件上添加結點,還是清空再添加 </param>
/// <param name="ParentNumberColumnIndex"> 在DataTable中,代表父節點編號的列索引 </param>
/// <param name="NumberColumnIndex"> 在DataTable中,代表當前節點編號的列索引 </param>
/// <param name="NameColumnIndex"> 在DataTable中,代表當前節點名稱的列索引 </param>
/// <returns> True/False </returns>
public bool ReadNodesFromDataTable(TreeView TreeView1, DataTable DT, bool IsAppendNode, int ParentNumberColumnIndex, int NumberColumnIndex, int NameColumnIndex)
{
try
{
if (IsAppendNode == false)
{
TreeView1.Nodes.Clear();
}
if (DT != null && DT.Rows.Count > 0)
{
DataRow[] DR = null;
DR = DT.Select(DT.Columns[ParentNumberColumnIndex].ColumnName + " ='' or " + DT.Columns[ParentNumberColumnIndex].ColumnName + " ='0' or " + DT.Columns[ParentNumberColumnIndex].ColumnName + " is null "); // 先將頂級的查出來
for ( int I = 0; I <= DR.Length - 1; I++) // 先將頂級的加入到TreeView中
{
TreeNode TNode = new TreeNode(DR[I][DT.Columns[NameColumnIndex].ColumnName].ToString());
TNode.Tag = DR[I][DT.Columns[NumberColumnIndex].ColumnName].ToString();
TNode.Name = DR[I][DT.Columns[NameColumnIndex].ColumnName].ToString();
TreeView1.Nodes.Add(TNode);
}
for ( int I = 0; I <= TreeView1.Nodes.Count - 1; I++) // 再遞歸遍歷結點
{
ForTreeNodeFormDT(TreeView1.Nodes[I], DT, ParentNumberColumnIndex, NumberColumnIndex, NameColumnIndex);
}
}
return false;
}
catch
{
return true;
}
}
/// <summary>
/// 從DT中遞歸遍歷出結點
/// </summary>
/// <param name="TempNode"> 傳入的頂級結點 </param>
/// <param name="DT"> 保存TreeView結構的DataTable </param>
/// <param name="ParentNumberColumnIndex"> 在DataTable中,代表父節點編號的列索引 </param>
/// <param name="NumberColumnIndex"> 在DataTable中,代表當前節點編號的列索引 </param>
/// <param name="NameColumnIndex"> 在DataTable中,代表當前節點名稱的列索引 </param>
private void ForTreeNodeFormDT(TreeNode TempNode, DataTable DT, int ParentNumberColumnIndex, int NumberColumnIndex, int NameColumnIndex)
{
string TTag = null;
TTag = TempNode.Tag.ToString();
DataRow[] DR = null;
DR = DT.Select(DT.Columns[ParentNumberColumnIndex].ColumnName + " =' " + TTag + " ' ");
for ( int I = 0; I <= DR.Length - 1; I++)
{
TreeNode TNode = new TreeNode(DR[I][DT.Columns[NameColumnIndex].ColumnName].ToString());
TNode.Tag = DR[I][DT.Columns[NumberColumnIndex].ColumnName].ToString();
TNode.Name = DR[I][DT.Columns[NameColumnIndex].ColumnName].ToString();
TempNode.Nodes.Add(TNode);
}
foreach (TreeNode aNode in TempNode.Nodes)
{
ForTreeNodeFormDT(aNode, DT, ParentNumberColumnIndex, NumberColumnIndex, NameColumnIndex);
}
}
#endregion
#region "讀取樹結點從Datatable"
/// <summary>
/// 讀取樹結點從Datatable"
/// </summary>
/// <param name="TreeView1"> 在填充的TreeView控件 </param>
/// <param name="DT"> 數據源DataTable </param>
/// <param name="IsAppendNode"> 是在現有TreeView控件上添加結點,還是清空再添加 </param>
/// <param name="ParentNumberColumnIndex"> 在DataTable中,代表父節點編號的列索引 </param>
/// <param name="NumberColumnIndex"> 在DataTable中,代表當前節點編號的列索引 </param>
/// <param name="NameColumnIndex"> 在DataTable中,代表當前節點名稱的列索引 </param>
/// <returns> True/False </returns>
public bool ReadNodesFromDataTable(TreeView TreeView1, DataTable DT, bool IsAppendNode, int ParentNumberColumnIndex, int NumberColumnIndex, int NameColumnIndex)
{
try
{
if (IsAppendNode == false)
{
TreeView1.Nodes.Clear();
}
if (DT != null && DT.Rows.Count > 0)
{
DataRow[] DR = null;
DR = DT.Select(DT.Columns[ParentNumberColumnIndex].ColumnName + " ='' or " + DT.Columns[ParentNumberColumnIndex].ColumnName + " ='0' or " + DT.Columns[ParentNumberColumnIndex].ColumnName + " is null "); // 先將頂級的查出來
for ( int I = 0; I <= DR.Length - 1; I++) // 先將頂級的加入到TreeView中
{
TreeNode TNode = new TreeNode(DR[I][DT.Columns[NameColumnIndex].ColumnName].ToString());
TNode.Tag = DR[I][DT.Columns[NumberColumnIndex].ColumnName].ToString();
TNode.Name = DR[I][DT.Columns[NameColumnIndex].ColumnName].ToString();
TreeView1.Nodes.Add(TNode);
}
for ( int I = 0; I <= TreeView1.Nodes.Count - 1; I++) // 再遞歸遍歷結點
{
ForTreeNodeFormDT(TreeView1.Nodes[I], DT, ParentNumberColumnIndex, NumberColumnIndex, NameColumnIndex);
}
}
return false;
}
catch
{
return true;
}
}
/// <summary>
/// 從DT中遞歸遍歷出結點
/// </summary>
/// <param name="TempNode"> 傳入的頂級結點 </param>
/// <param name="DT"> 保存TreeView結構的DataTable </param>
/// <param name="ParentNumberColumnIndex"> 在DataTable中,代表父節點編號的列索引 </param>
/// <param name="NumberColumnIndex"> 在DataTable中,代表當前節點編號的列索引 </param>
/// <param name="NameColumnIndex"> 在DataTable中,代表當前節點名稱的列索引 </param>
private void ForTreeNodeFormDT(TreeNode TempNode, DataTable DT, int ParentNumberColumnIndex, int NumberColumnIndex, int NameColumnIndex)
{
string TTag = null;
TTag = TempNode.Tag.ToString();
DataRow[] DR = null;
DR = DT.Select(DT.Columns[ParentNumberColumnIndex].ColumnName + " =' " + TTag + " ' ");
for ( int I = 0; I <= DR.Length - 1; I++)
{
TreeNode TNode = new TreeNode(DR[I][DT.Columns[NameColumnIndex].ColumnName].ToString());
TNode.Tag = DR[I][DT.Columns[NumberColumnIndex].ColumnName].ToString();
TNode.Name = DR[I][DT.Columns[NameColumnIndex].ColumnName].ToString();
TempNode.Nodes.Add(TNode);
}
foreach (TreeNode aNode in TempNode.Nodes)
{
ForTreeNodeFormDT(aNode, DT, ParentNumberColumnIndex, NumberColumnIndex, NameColumnIndex);
}
}
#endregion
方法二:
做分類 經常會用到無限級別的分類 先介紹一下數據庫的表結構
tid 類別編號
tname 類別名稱
pid 父類編號
測試數據就不寫了,大家可以自己插入一下試試
查詢制定類別的 所有的子類 sql 的 代碼

alter proc proc_chaxun (@tid int ) as begin with tt as ( select tid,tname,pid from dbo.t_goodsType where tid=@tid union all select t.tid,t.tname,t.pid from dbo.t_goodsType t inner join tt on t.pid=tt.tid ) select * from tt end
查詢之后獲取記錄集 綁定到前台的 TreeView 上面

/// <summary> /// 給Tree 綁定數據 遞歸添加子節點 /// </summary> /// <param name="dv">數據視圖</param> /// <param name="tnOld">添加數據的節點</param> public void TreeDataBind(DataView dv,TreeNode tnOld) { TreeNode tnNew; //創建一個新的節點 foreach (DataRowView drv in dv) { //為新的借點設置屬性 tnNew = tnOld.Nodes.Add(drv["tname"].ToString()); tnNew.Tag = drv["tid"]; //過濾數據視圖 父類id = 上一級的tid dv.RowFilter = "pid=" + drv["tid"].ToString(); //自己調用自己 TreeDataBind(dv, tnNew); } }
調用的方法很簡單

DataTable dtRet = (DataTable)dh.ExecProcRetObj(ep); DataView dv = new DataView(dtRet); dv.RowFilter = "pid=0"; TreeDataBind(dv, this.treeView1.Nodes.Add("商品類別"));
效果
本文轉載:http://blog.csdn.net/q107770540/article/details/7708418
List<DetptInfo> lstDept = new List<DetptInfo> { new DetptInfo {ID=1,DeptName="公司",ParentID=0}, new DetptInfo {ID=10,DeptName="軟件中心",ParentID=1}, new DetptInfo {ID=11,DeptName="綜合辦公室",ParentID=1}, new DetptInfo {ID=100,DeptName="人力資源部",ParentID=11}, new DetptInfo {ID=101,DeptName="行政部",ParentID=11}, }; public static List<DetptInfo> GetSonID(List<DetptInfo> lstDept, int p_id) { var query = from c in lstDept where c.ParentID == p_id select c; return query.Concat(query.SelectMany(t => GetSonID(lstDept, t.ID))).ToList(); } --調用: var query = GetSonID(lstDept, 0); Console.WriteLine("Id\tName\tParent"); query.ToList().ForEach(q => Console.WriteLine("{0}\t{1}\t{2}", q.ID, q.DeptName, q.ParentID));