c# - HTML recursive binding -
i have datatble below:
id menuname url parentid 1 home ~/home.aspx null 2 product ~/products.aspx null 3 services ~/services.aspx null 4 erp ~/erp.aspx 2 5 hrm ~/hrm.aspx 4 7 payroll ~/payroll.aspx 4 8 programming ~/programming.aspx 3 9 advertising ~/advert.aspx 3 10 television advert ~/tvadvert.aspx 9 11 radio advert ~/radioadvert.aspx 9 ........ ........ so want generate menu item unordered list based on datatable above such items null parentid should first level menu , others submenus based on parentid so:
<ul class="menu"> <li><a href="home.aspx">home</a></li> <li><a href="produc.aspx">product</a> <ul> <li> <a href="erp.aspx">erp</a> <ul> <li><a href="hrm.aspx">hrm</a></li> <li><a href="payroll.aspx">payroll</a></li> </ul> </li> </ul> </li> <li><a href="services.aspx">services</a> <ul> <li><a href="programming.aspx">advertising</a></li> <li><a href="advert.aspx">programming</a></li> </ul> </li> .....etc </ul> below code seem incomplete:
public static string addtolist() { datatable table = new datatable(); table = getmenus(); system.text.stringbuilder sb = new system.text.stringbuilder(); foreach (datarow row in table.rows()) { string parentid = row["parentmenuid"].tostring(); //string url = server.mappath(m.url); if (string.isnullorempty(parentid)) { sb.append(string.format("<ul class=\"menu\"><li><a href=\"{0}\">{1}</a></li></ul>", row["url"].tostring(), row["description"].tostring())); } } return sb.tostring(); } gets top menu other effort submenu doesnt work. pls me out. in advance
out of pure boredom, usnig compositin of controls asp.net (each control has controls property), tree , rendered such (which means dont need real recursion), , array of indexes easy by-id access created controls
public partial class _default : system.web.ui.page { protected void page_load(object sender, eventargs e) { form.controls.add(addtolist()); } public static htmlgenericcontrol addtolist() { htmlgenericcontrol menu = new htmlgenericcontrol("ul"); datatable table = getmenus(); //note initialized 7, because max rows id, , // im basing builder on indexes work. can replaced // dictionary<int,htmlgenericcontrol> or othre suitable collection htmlgenericcontrol[] arrayoflists = new htmlgenericcontrol[7]; foreach (datarow row in table.rows) { //assume control has no children, unless proved otherwise htmlgenericcontrol temp = new htmlgenericcontrol("li"); //add control indexes place in array , init arrayoflists[(int)row["id"] - 1] = temp; htmlanchor link = new htmlanchor(); link.href = row["url"].tostring(); link.innertext = row["menuname"].tostring(); temp.controls.add(link); int? parentid = string.isnullorempty(row["parentmenuid"].tostring()) ? null : (int?)int.parse(row["parentmenuid"].tostring()); if (parentid.hasvalue) { // if control has parent - make parent ul insead of li // , add parents collection arrayoflists[parentid.value - 1].tagname = "ul"; arrayoflists[parentid.value - 1].controls.add(arrayoflists[(int)row["id"] - 1]); } else { // no parent = add first created ul menu menu.controls.add(temp); } } return menu; } public static datatable getmenus() { datatable dt = new datatable (); dt.columns.add("id", typeof(int)); dt.columns.add("menuname", typeof(string)); dt.columns.add("url", typeof(string)); dt.columns.add("parentmenuid", typeof(string)); dt.rows.add(1,"home","~/home.aspx", null ); dt.rows.add( 2,"product","~/products.aspx", null); dt.rows.add(3,"services", "~/services.aspx",null); dt.rows.add(4, "erp", "~/erp.aspx", "2" ); dt.rows.add( 5 ,"hrm" ,"~/hrm.aspx", "4" ); dt.rows.add(7, " payroll", "~/payroll.aspx", "4"); return dt; }
Comments
Post a Comment