在ASP.Net中使用C#,我从数据库动态填充一个ASP.Net菜单控件。我正在尝试使这些物品无法使用,其中有一些儿童物品在它们下面。这是为了确保在移动设备上,我们没有鼠标悬停的情况下,单击父菜单项时,用户一定会获取子项而不是回发。下面的代码工作正常,但有一个缺点,它需要花费太多时间来加载,同时通过在单个视图中垂直显示所有项目(所有父项+所有子项)来显示错误结果。数据库驱动菜单太慢
SqlCommand com = new SqlCommand("SELECT * FROM menutab order by sno", c.con);
if(c.con.State == ConnectionState.Closed)
c.con.Open();
da = new SqlDataAdapter(com);
table = new DataTable();
da.Fill(table);
parents = new int[table.Rows.Count];
for (int i = 0; i < table.Rows.Count; i++)
if (table.Rows[i].ItemArray.GetValue(2).ToString() != String.Empty)
parents[i] = Convert.ToInt32(table.Rows[i].ItemArray.GetValue(2).ToString());
DataRow[] drowpar = table.Select("menu_parent = " + 0);
view = new DataView(table);
view.RowFilter = "menu_parent is NULL";
foreach (DataRowView row in view)
{
MenuItem menuItem = new MenuItem(row["item"].ToString(), row["sno"].ToString());
//menuItem.NavigateUrl = row["menu_url"].ToString();
for (int i = 0; i < parents.Length; i++)
{
if (Convert.ToInt32(row["sno"].ToString()) == parents[i])
{
menuItem.Selectable = false;
}
}
NavigationMenu.Items.Add(menuItem);
AddChildItems(table, menuItem);
}
private void AddChildItems(DataTable table, MenuItem menuItem)
{
DataView viewItem = new DataView(table);
viewItem.RowFilter = "menu_parent=" + menuItem.Value;
foreach (DataRowView childView in viewItem)
{
MenuItem childItem = new MenuItem(childView["item"].ToString(), childView["sno"].ToString());
//childItem.NavigateUrl = childView["menu_url"].ToString();
for (int i = 0; i<parents.Length; i++)
{
if (Convert.ToInt32(childView["sno"].ToString()) == parents[i])
{
childItem.Selectable = false;
}
}
menuItem.ChildItems.Add(childItem);
AddChildItems(table, childItem);
}
}
对于其他代码实现,此过程可以更快更可靠吗?
速度有多慢?哪部分代码很慢? – Bert
@Bert Evans正如在描述中提到的iteself,:::“它需要太多的时间加载,同时通过在单个视图中垂直显示所有项目(所有父项+所有子项)来显示错误结果。”加载页面时,完整菜单将垂直显示,其中包含所有父项和子项,而不包含任何树/层次结构。然后,它采用分层菜单的形状并进行正常调整。这个过程需要时间,用户的印象变差。我调试了代码,发现oops运行的次数太多,因此处理时间更多。 – ITSagar