第一次发贴,写的不好见谅!!!!
以前在生成导航菜单时经常需要直接从后台追加出一个用div生成的HTML的树形结构,但C#因为直接有TreeView控件而很少有从后台追加的,今天写了一个简单的后台生成的树。
其实所谓的无限级树形菜单生成就是在遍历时不断的跟据父节点ID在这个集合中查找它的parentId进行比较。
这里生成的比较简单,并且JS动态折叠也没有做,刚学LINQ TO SQL把自己想做的东西做出来,肯定有不足的地方需要指正,以后慢慢修改吧!!
这里的dv只是页面上用来呈现树的一个层,这里就不再啰嗦了!
这里是数据库中的表(tbRule)结构(比较简单,但能说明问题我觉得就够了):
#region
public void GetTheTopMenu()
{
tbRule tr = new tbRule();
RuleMenuDataContext rm = new RuleMenuDataContext();
var parentMenu = from rule in rm.tbRule select new { rule };
List < tbRule > rulesList = GetChild();
int a = 0 ;
foreach (var rul in parentMenu)
{
if (rul.rule.childId == 0 )
{
this .dv.InnerHtml += " <div style=\ " padding - left: " + 10 * a + " px;border:solid 1px black;\ " id=\ " N_ " + rul.rule.id + " \ " οnclick=\ " ShowChildDiv( ' N_" + rul.rule.id + "1 ' )\ " > " + rul.rule.ruleName + " </div><br /><div id=N_ " + rul.rule.id + " 1> " ;
ShowChildNode(rul.rule.id, rulesList);
this .dv.InnerHtml += " </div> " ;
}
}
}
/// <summary>
/// 显示子节点信息,根据parentId不断地在ruleList中进行查找子项
/// </summary>
/// <param name="parentId"></param>
/// <param name="ruleList"></param>
// 这里的a是用来在子项中控制它与浏览器左边的位置。
int a = 0 ;
public void ShowChildNode( int parentId, List < tbRule > ruleList)
{
a ++ ;
var rule = from rules in ruleList where rules.childId == parentId select rules;
foreach (tbRule r in rule)
{
a ++ ;
this .dv.InnerHtml += " <div style=\ " padding - left: " + 10 * a + " px;border:solid 1px black;\ " id=\ " N_ " + r.id + " \ " οnclick=\ " ShowChildDiv( ' N_"+r.id+"1 ' )\ " > " + r.ruleName + " </div><br /><div id=N_ " + r.id + " 1> " ;
ShowChildNode(r.id, ruleList);
this .dv.InnerHtml += " </div> " ;
}
}
#endregion
#region Convert ToList
public static List < tbRule > GetChild()
{
RuleMenuDataContext rm = new RuleMenuDataContext ();
var q = rm.tbRule;
return q.ToList();
}
#endregion
public void GetTheTopMenu()
{
tbRule tr = new tbRule();
RuleMenuDataContext rm = new RuleMenuDataContext();
var parentMenu = from rule in rm.tbRule select new { rule };
List < tbRule > rulesList = GetChild();
int a = 0 ;
foreach (var rul in parentMenu)
{
if (rul.rule.childId == 0 )
{
this .dv.InnerHtml += " <div style=\ " padding - left: " + 10 * a + " px;border:solid 1px black;\ " id=\ " N_ " + rul.rule.id + " \ " οnclick=\ " ShowChildDiv( ' N_" + rul.rule.id + "1 ' )\ " > " + rul.rule.ruleName + " </div><br /><div id=N_ " + rul.rule.id + " 1> " ;
ShowChildNode(rul.rule.id, rulesList);
this .dv.InnerHtml += " </div> " ;
}
}
}
/// <summary>
/// 显示子节点信息,根据parentId不断地在ruleList中进行查找子项
/// </summary>
/// <param name="parentId"></param>
/// <param name="ruleList"></param>
// 这里的a是用来在子项中控制它与浏览器左边的位置。
int a = 0 ;
public void ShowChildNode( int parentId, List < tbRule > ruleList)
{
a ++ ;
var rule = from rules in ruleList where rules.childId == parentId select rules;
foreach (tbRule r in rule)
{
a ++ ;
this .dv.InnerHtml += " <div style=\ " padding - left: " + 10 * a + " px;border:solid 1px black;\ " id=\ " N_ " + r.id + " \ " οnclick=\ " ShowChildDiv( ' N_"+r.id+"1 ' )\ " > " + r.ruleName + " </div><br /><div id=N_ " + r.id + " 1> " ;
ShowChildNode(r.id, ruleList);
this .dv.InnerHtml += " </div> " ;
}
}
#endregion
#region Convert ToList
public static List < tbRule > GetChild()
{
RuleMenuDataContext rm = new RuleMenuDataContext ();
var q = rm.tbRule;
return q.ToList();
}
#endregion
上次没有好好完善,这次把它完善后放上来的,树节点全部是用div做的,是一次性加载出的所有的节点信息,有需要可以直接更改!!!!!