//递归生成菜单 private void CreatMenuItem() { OleDbConnection myConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\\Menu.mdb;Persist Security Info=False;"); OleDbCommand myComm = new OleDbCommand("SELECT nid,name,pid FROM Items ORDER BY pid,nid",myConn); OleDbDataAdapter myAda = new OleDbDataAdapter(myComm); DataSet ds = new DataSet(); myAda.Fill(ds,"MenuItemINfos"); DataRow [] drs = ds.Tables["MenuItemINfos"].Select("pid = 0"); int index = 0; foreach(DataRow dr in drs) { MenuItem mi =new MenuItem((string)dr["name"]); this.mainMenu1.MenuItems.Add(index++,mi); CreatBranch(mi,(int)dr["nid"],ds); } } private void CreatBranch(MenuItem parmt,int pid,DataSet ds) { int index = 0; foreach(DataRow dr in ds.Tables["MenuItemINfos"].Select("pid = "+pid)) { MenuItem mi =new MenuItem((string)dr["name"]); parmt.MenuItems.Add(index++,mi); CreatBranch(mi,(int)dr["nid"],ds); } }
假定tree为TreeView控件,data为数据表(id, pid, name分别为ID、父ID,名称)
private void BuildTree(TreeNode tn)
{
int i;
// 空节点时创建根节点,父ID为0的当作根节点
if(tn == null)
{
tree.Nodes.Clear();
for(i = 0 ; i < data.Rows.Count ; i ++)
{
if(data.Rows[i]["pid"].ToString() == "0")
{
TreeNode tmp = new TreeNode(data.Rows[i]["name"].ToString());
tmp.Tag = Int32.Parse(data.Rows[i]["id"].ToString());
tree.Nodes.Add(tmp);
}
}
// 循环递归创建树
for(i = 0 ; i < tree.Nodes.Count ; i ++)
{
BuildTree(tree.Nodes[i]);
}
}
else // 节点非空为递归调用
{
for(i = 0 ; i < data.Rows.Count ; i ++)
{
if(tn.Tag.ToString() == data.Rows[i]["pid"].ToString())
{
TreeNode tmp = new TreeNode(data.Rows[i]["name"].ToString());
tmp.Tag = Int32.Parse(data.Rows[i]["id"].ToString());
tn.Nodes.Add(tmp);
}
}
for(i = 0 ; i < tn.Nodes.Count ; i ++)
{
BuildTree(tn.Nodes[i]);
}
}
}调用:
data = GetDataTable(...);
BuildTree(null);
http://blog.csdn.net/Knight94/archive/2006/05/01/704281.aspx
///创建树
/// </summary>
/// <param name="ParentID">起始父节点</param>
/// <param name="pNode">树对象</param>
/// <param name="TitleName">标题字段名称</param>
/// <param name="id">id字段名称</param>
/// <param name="ParentId">ParentId字段名称</param>
/// <param name="treeNode">返回树对象</param>
/// <param name="ds">应用数据表</param>
public static void CreateTree(int ParentID, TreeNode pNode, string id, string TitleName, string ParentId, ref TreeNode treeNode, DataTable dvTree)
{
foreach (DataRow Row in dvTree.Select("[" + ParentId + "] = '" + ParentID + "'"))
{
TreeNode Node = new TreeNode();
if (pNode == null)
{ //添加根节点
Node.Text = Row[TitleName].ToString();
Node.Tag = Row[id].ToString();
treeNode.Nodes.Add(Node);
CreateTree(Int32.Parse(Row[id].ToString()), Node, id, TitleName, ParentId, ref treeNode, dvTree); //再次递归
}
else
{ //添加当前节点的子节点
Node.Text = Row[TitleName].ToString();
Node.Tag = Row[id].ToString();
pNode.Nodes.Add(Node);
CreateTree(Int32.Parse(Row[id].ToString()), Node, id, TitleName, ParentId, ref treeNode, dvTree); //再次递归
}
}
}
数据表中只要有一个字段标示父id即可
private void CreatMenuItem()
{
OleDbConnection myConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\\Menu.mdb;Persist Security Info=False;");
OleDbCommand myComm = new OleDbCommand("SELECT nid,name,pid FROM Items ORDER BY pid,nid",myConn);
OleDbDataAdapter myAda = new OleDbDataAdapter(myComm);
DataSet ds = new DataSet();
myAda.Fill(ds,"MenuItemINfos");
DataRow [] drs = ds.Tables["MenuItemINfos"].Select("pid = 0");
int index = 0;
foreach(DataRow dr in drs)
{
MenuItem mi =new MenuItem((string)dr["name"]);
this.mainMenu1.MenuItems.Add(index++,mi);
CreatBranch(mi,(int)dr["nid"],ds);
}
}
private void CreatBranch(MenuItem parmt,int pid,DataSet ds)
{
int index = 0;
foreach(DataRow dr in ds.Tables["MenuItemINfos"].Select("pid = "+pid))
{
MenuItem mi =new MenuItem((string)dr["name"]);
parmt.MenuItems.Add(index++,mi);
CreatBranch(mi,(int)dr["nid"],ds);
}
}