表结构图
前置代码比较简单,在页面中放一个 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);
}
}
}
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);
}
}
}
测试的菜单是四级结构,相信更多级别的也是这样(懒得测试了)