C# HTML递归绑定
我有一个数据包,如下所示:C# HTML递归绑定,c#,asp.net,html,C#,Asp.net,Html,我有一个数据包,如下所示: 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
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
........
........
因此,我想根据上面的datatable将菜单项生成一个无序列表,这样parentid为null的项应该是第一级菜单
其他子菜单将基于其parentid,如下所示:
<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>
-
-
-
等
下面是我似乎不完整的代码:
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();
}
This gets all top menu but all other effort to get submenu doesnt work. Pls help me out.
Thanks in advance
public静态字符串AddToList()
{
DataTable=新的DataTable();
table=GetMenus();
System.Text.StringBuilder sb=新的System.Text.StringBuilder();
foreach(表.Rows()中的DataRow行)
{
字符串parentId=行[“parentmenuId”]。ToString();
//字符串url=Server.MapPath(m.url);
if(string.IsNullOrEmpty(parentId))
{
sb.Append(String.Format(“
出于纯粹的厌倦,我们使用asp.net控件的组合(每个控件都有一个控件属性),它已经是一个树,并以树的形式呈现(这意味着我不需要真正的递归),以及一个索引数组,以便通过id轻松访问创建的控件
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 i initialized this to 7, because this is the max rows id, and
// im basing my builder on indexes to work. This can be easily replaced to
// a dictionary<int,HtmlGenericControl> or any 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 the control to its indexes place in the array and init it
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 a control has a parent - make its parent a ul insead of li
// and add it to the parents collection
arrayOfLists[parentId.Value - 1].TagName = "ul";
arrayOfLists[parentId.Value - 1].Controls.Add(arrayOfLists[(int)row["id"] - 1]);
}
else
{
// no parent = add to the 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;
}
public分部类\u默认值:System.Web.UI.Page
{
受保护的无效页面加载(对象发送方、事件参数e)
{
Add(AddToList());
}
公共静态HtmlGenericControl AddToList()
{
HtmlGenericControl菜单=新的HtmlGenericControl(“ul”);
DataTable=GetMenus();
//注意,我将其初始化为7,因为这是最大行id,并且
//我把我的构建器建立在索引的基础上工作。这可以很容易地替换为
//字典或其他合适的收藏
HtmlGenericControl[]arrayOfLists=新的HtmlGenericControl[7];
foreach(table.Rows中的DataRow行)
{
//假设控件没有子对象,除非另有证明
HtmlGenericControl temp=新的HtmlGenericControl(“li”);
//将控件添加到它在数组中的索引位置并初始化它
arrayOfLists[(int)行[“id”]-1]=临时;
HtmlAnchor link=新HtmlAnchor();
link.HRef=row[“url”].ToString();
link.InnerText=行[“menuname”].ToString();
温度控制添加(链接);
int?parentId=string.IsNullOrEmpty(第[“parentmenuId”].ToString())行?null:(int?)int.Parse(第[“parentmenuId”].ToString()行);
if(parentId.HasValue)
{
//如果控件有父控件-将其父控件设为ul insead li
//并将其添加到父集合中
arrayOfLists[parentId.Value-1]。标记名=“ul”;
arrayOfLists[parentId.Value-1].Controls.Add(arrayOfLists[(int)行[“id”]-1]);
}
其他的
{
//无父项=添加到第一个创建的ul菜单
菜单.控件.添加(临时);
}
}
返回菜单;
}
公共静态数据表GetMenus()
{
DataTable dt=新的DataTable();
添加(“id”,typeof(int));
添加(“menuname”,typeof(string));
添加(“url”,typeof(string));
Add(“parentmenuId”,typeof(string));
添加(1,“Home”,“~/Home.aspx”,null);
添加(2,“Product”,“~/products.aspx”,空);
Add(3,“services”,“~/services.aspx”,null);
添加(4,“ERP”、“~/ERP.aspx”、“2”);
添加(5,“HRM”、“~/HRM.aspx”、“4”);
添加(7,“Payroll”、“~/Payroll.aspx”、“4”);
返回dt;
}
首先,您的代码中没有递归。我假设菜单的树状结构意味着呈现它的代码中存在递归。感谢您不让我知道这是否有用。评论/接受/拒绝答案真的有那么难吗?