遞歸方法:
#region 加載樹節點
/// <summary>
/// 加載樹節點。樹的基本思路是:從指定的父節點開始遞歸調用顯示子樹(可以對DataTable.DefaultView.RowFilter設置過濾條件)
/// </summary>
/// <param name="treeNodeCollection">要加載TreeNode對象的TreeNode.Nodes的集合</param>
/// <param name="dt">DataTable 對象</param>
/// <param name="nodeIdField">保存節點ID列的字段名稱</param>
/// <param name="parentIdField">保存父節點ID列的字段名稱(只允許字符和數字類型)</param>
/// <param name="nodeNameField">保存節點名稱列的字段名稱</param>
/// <param name="nodeImageIndexField">保存節點圖片索引列的字段名稱</param>
/// <param name="nodeSelectedImageIndexField">保存選擇節點圖片索引列的字段名稱</param>
/// <param name="parentNodeTag">父節點標記</param>
public void LoadTreeNode(TreeNodeCollection treeNodeCollection,DataTable dt,string nodeIdField,string parentIdField,string nodeNameField,string nodeImageIndexField,string nodeSelectedImageIndexField,string parentNodeTag)
{
try
{
if(dt.Rows.Count<=0) return;
TreeNode tmpNode;
int imageIndex=-1;
string oldFilter=dt.DefaultView.RowFilter;
DataView dv=new DataView(dt);
dv.Sort=dt.DefaultView.Sort;
if(dv[0][parentIdField].GetType()==typeof(System.String))
dv.RowFilter=parentIdField+"='"+parentNodeTag+"'";
else
dv.RowFilter=parentIdField+"="+parentNodeTag;
if(oldFilter!=string.Empty)
dv.RowFilter=dv.RowFilter+" and "+oldFilter;
foreach(DataRowView drv in dv)
{
tmpNode=new TreeNode();
tmpNode.Text=drv[nodeNameField].ToString();//+drv[nodeIdField].ToString().Trim();
tmpNode.Tag=drv[nodeIdField];
if(drv[nodeSelectedImageIndexField]!=System.DBNull.Value)
{
imageIndex=Convert.ToInt32(drv[nodeSelectedImageIndexField]);
if(imageIndex>=0)
{
tmpNode.ImageIndex=imageIndex;
tmpNode.SelectedImageIndex=imageIndex;
}
}
if(drv[nodeImageIndexField]!=System.DBNull.Value)
{
imageIndex=Convert.ToInt32(drv[nodeImageIndexField]);
if(imageIndex>=0)
{
tmpNode.ImageIndex=imageIndex;
}
}
string father=drv[nodeIdField].ToString();
treeNodeCollection.Add(tmpNode);
LoadTreeNode(tmpNode.Nodes,dt,nodeIdField,parentIdField,nodeNameField,nodeImageIndexField,nodeSelectedImageIndexField,father);
}
}
catch(Exception te)
{
MessageBox.Show(te.Message,"Error",MessageBoxButtons.OK,MessageBoxIcon.Warning);
}
}
#endregion
/// <summary>
/// 加載樹節點。樹的基本思路是:從指定的父節點開始遞歸調用顯示子樹(可以對DataTable.DefaultView.RowFilter設置過濾條件)
/// </summary>
/// <param name="treeNodeCollection">要加載TreeNode對象的TreeNode.Nodes的集合</param>
/// <param name="dt">DataTable 對象</param>
/// <param name="nodeIdField">保存節點ID列的字段名稱</param>
/// <param name="parentIdField">保存父節點ID列的字段名稱(只允許字符和數字類型)</param>
/// <param name="nodeNameField">保存節點名稱列的字段名稱</param>
/// <param name="nodeImageIndexField">保存節點圖片索引列的字段名稱</param>
/// <param name="nodeSelectedImageIndexField">保存選擇節點圖片索引列的字段名稱</param>
/// <param name="parentNodeTag">父節點標記</param>
public void LoadTreeNode(TreeNodeCollection treeNodeCollection,DataTable dt,string nodeIdField,string parentIdField,string nodeNameField,string nodeImageIndexField,string nodeSelectedImageIndexField,string parentNodeTag)
{
try
{
if(dt.Rows.Count<=0) return;
TreeNode tmpNode;
int imageIndex=-1;
string oldFilter=dt.DefaultView.RowFilter;
DataView dv=new DataView(dt);
dv.Sort=dt.DefaultView.Sort;
if(dv[0][parentIdField].GetType()==typeof(System.String))
dv.RowFilter=parentIdField+"='"+parentNodeTag+"'";
else
dv.RowFilter=parentIdField+"="+parentNodeTag;
if(oldFilter!=string.Empty)
dv.RowFilter=dv.RowFilter+" and "+oldFilter;
foreach(DataRowView drv in dv)
{
tmpNode=new TreeNode();
tmpNode.Text=drv[nodeNameField].ToString();//+drv[nodeIdField].ToString().Trim();
tmpNode.Tag=drv[nodeIdField];
if(drv[nodeSelectedImageIndexField]!=System.DBNull.Value)
{
imageIndex=Convert.ToInt32(drv[nodeSelectedImageIndexField]);
if(imageIndex>=0)
{
tmpNode.ImageIndex=imageIndex;
tmpNode.SelectedImageIndex=imageIndex;
}
}
if(drv[nodeImageIndexField]!=System.DBNull.Value)
{
imageIndex=Convert.ToInt32(drv[nodeImageIndexField]);
if(imageIndex>=0)
{
tmpNode.ImageIndex=imageIndex;
}
}
string father=drv[nodeIdField].ToString();
treeNodeCollection.Add(tmpNode);
LoadTreeNode(tmpNode.Nodes,dt,nodeIdField,parentIdField,nodeNameField,nodeImageIndexField,nodeSelectedImageIndexField,father);
}
}
catch(Exception te)
{
MessageBox.Show(te.Message,"Error",MessageBoxButtons.OK,MessageBoxIcon.Warning);
}
}
#endregion
調用方法:
LoadTreeNode(this.treeView1.Nodes,ds.Tables[dataMember],"NodeId","ParentId","NodeName","NodeImageIndex","NodeSelectedImageIndex",rootTag);