表结构图

前置代码比较简单,在页面中放一个 treeview 控件和一个 linkbutton 控件就可以了。

重点来看一下后置代码:

 

后置代码
public partial class html2 : System.Web.UI.Page
{
    
//用重载实现 treeview 的无限极递归调用
    public string connString
    { 
get { return ConfigurationManager.ConnectionStrings["uMenu"].ConnectionString; } }

    
protected void LinkButton1_Click(object sender, EventArgs e)
    {
        
string sql = "select * from umenudata";
        OleDbDataAdapter da 
= new OleDbDataAdapter(sql, connString);

        DataSet ds 
= new DataSet();
        da.Fill(ds);

        TreeNode[] tn 
= getMenu(0, ds);
        
foreach (TreeNode tnn in tn)
        {
            TreeView1.Nodes.Add(tnn);
        }
    }

    
//用重载实现递归,返回符合要求的所有菜单项
    
//使用这个函数的返回值填充 TreeView 就可以了
    TreeNode[] getMenu(int pid, DataSet ds)
    {
        DataView dv 
= ds.Tables[0].DefaultView;
        dv.RowFilter 
= "PID=" + pid.ToString();
        
int i = 0;
        TreeNode[] tn 
= new TreeNode[dv.Count];

        
//一级项循环
        foreach (DataRowView drv in dv)
        {
            tn[i] 
= new TreeNode(drv["mName"].ToString(), drv["ID"].ToString());

            
//使用递归方式插入下级菜单的数组
            getMenu(int.Parse(tn[i].Value.ToString()), ds, tn[i]);

            i
++;
        }

        
return tn;
    }

    
//递归过程
    void getMenu(int pid, DataSet ds, TreeNode tn)
    {
        DataView dv 
= ds.Tables[0].DefaultView;
        dv.RowFilter 
= "PID=" + pid.ToString();

        
//当前项循环
        foreach (DataRowView drv in dv)
        {
            TreeNode tn0 
= new TreeNode(drv["mName"].ToString(), drv["ID"].ToString());

            
//插入下级项
            tn.ChildNodes.Add(tn0);

            
//递归调用
            getMenu(int.Parse(drv["ID"].ToString()), ds, tn0);
        }

    }
}

 

测试的菜单是四级结构,相信更多级别的也是这样(懒得测试了)

posted on 2008-12-26 16:49  jarod99  阅读(1205)  评论(0编辑  收藏  举报