/数据库表结构:code name url parentcode name url parent
0001 系统管理 # 00
000101 用户信息 # 0001
......//构建树形菜单 方法的调用形式是:InitData("00");
//其中00在数据库里设定为顶级父类
/
private string InitData(string parentId)
{
StringBuilder sb = new StringBuilder(); DataRow[] parentRows = GetData().Tables[0].Select("parent='" + parentId + "'"); foreach (DataRow parentRow in parentRows)
{ DataRow[] childRows = GetData().Tables[0].Select("parent='" + parentRow["code"].ToString() + "'"); sb.Append("<li><span>" + parentRow["name"].ToString() + "</span>");
sb.Append("<ul>"); foreach (DataRow childRow in childRows)
{
string code = childRow["code"].ToString(); DataRow[] leafRows = GetData().Tables[0].Select("parent='" + childRow["code"].ToString() + "'"); int count = leafRows.Count(); if (leafRows.Count() > 0)
{
sb.Append("<li><span>" + childRow["name"].ToString() + "</span>");
sb.Append("<ul>");
foreach (DataRow leafRow in leafRows)
{
sb.Append("<li>");
sb.Append("<a href='"+leafRow["url"].ToString()+"'>" + leafRow["name"].ToString() + "</a>");
sb.Append("</li>");
}
sb.Append("</ul>");
sb.Append("</li>"); }
else
{
sb.Append("<li>");
sb.Append("<a href='"+childRow["url"].ToString()+"'>" + childRow["name"].ToString() + "</a>");
sb.Append("</li>");
}
} sb.Append("</ul>");
sb.Append("</li>"); } return sb.ToString(); }
以上方法能否改为递归?能改的话如何改?请赐教!
该方法是根据GetData()这个方法的DateSet数据结来构建一个以<ul>标签实现的树形菜单。
以上方法写死是三级菜单,如果数据库有四级,还得写代码判断,我想将此方法用递归来实现,但不知道如何重构。
/// 递归添加节点
/// </summary>
/// <param name="id"></param>
/// <param name="parentnode"></param>
private void AddNode(int id, TreeNode parentnode)
{
string sql = "select * from Subject";//sql 语句
DataTable table = DAL.DBHelper.GetTable(sql);//获取数据 DataView view = new DataView(table);//把表数据添加到自定义视图中 view.RowFilter = "ParentId=" + id;//设置视图查询条件 foreach (DataRowView row in view)//遍历视图中数据
{
TreeNode node = new TreeNode();//实例化树节点
node.Expanded = false;
node.Text = row[1].ToString();
node.Value = row[0].ToString();
int newid = Convert.ToInt32(row[0]); if (parentnode != null)
{
//node.Expanded = false;
parentnode.ChildNodes.Add(node);
AddNode(newid, node);//递归查找节点
}
else
{
TreeView1.Nodes.Add(node);
AddNode(newid, node);
} }
}
InitData方法没有注释,重新注一下!
/*
*
*/
private string InitData(string parentId)
{
StringBuilder sb = new StringBuilder();
//第一次筛选数据 parent="00"
DataRow[] parentRows = GetData().Tables[0].Select("parent='" + parentId + "'"); foreach (DataRow parentRow in parentRows)
{
//第二次筛选数据 parent="0001"
DataRow[] childRows = GetData().Tables[0].Select("parent='" + parentRow["code"].ToString() + "'"); sb.Append("<li><span>" + parentRow["name"].ToString() + "</span>");
sb.Append("<ul>"); foreach (DataRow childRow in childRows)
{
string code = childRow["code"].ToString();
//第三次筛选数据 parent="000101"
DataRow[] leafRows = GetData().Tables[0].Select("parent='" + childRow["code"].ToString() + "'"); int count = leafRows.Count(); if (leafRows.Count() > 0)
{
sb.Append("<li><span>" + childRow["name"].ToString() + "</span>");
sb.Append("<ul>");
foreach (DataRow leafRow in leafRows)
{
sb.Append("<li>");
sb.Append("<a href='"+leafRow["url"].ToString()+"'>" + leafRow["name"].ToString() + "</a>");
sb.Append("</li>");
}
sb.Append("</ul>");
sb.Append("</li>"); }
else
{
sb.Append("<li>");
sb.Append("<a href='"+childRow["url"].ToString()+"'>" + childRow["name"].ToString() + "</a>");
sb.Append("</li>");
}
}
sb.Append("</ul>");
sb.Append("</li>");
} return sb.ToString(); }
我的方法没有用到reeNode 节点!