2016-08-15 85 views
2

在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); 
    } 
} 

对于其他代码实现,此过程可以更快更可靠吗?

+0

速度有多慢?哪部分代码很慢? – Bert

+0

@Bert Evans正如在描述中提到的iteself,:::“它需要太多的时间加载,同时通过在单个视图中垂直显示所有项目(所有父项+所有子项)来显示错误结果。”加载页面时,完整菜单将垂直显示,其中包含所有父项和子项,而不包含任何树/层次结构。然后,它采用分层菜单的形状并进行正常调整。这个过程需要时间,用户的印象变差。我调试了代码,发现oops运行的次数太多,因此处理时间更多。 – ITSagar

回答

1

数据库驱动的菜单肯定会在第一次加载时显示一些滞后,这也取决于您的Web服务器的速度。但是,下面的代码将帮助您减少加载时间:

DataRow[] drowpar = table.Select("menu_parent = " + 0); 
foreach (DataRow row in drowpar) 
{ 
    MenuItem menuItem = new MenuItem(row["item"].ToString(), row["sno"].ToString()); 
    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()); 
     menuItem.Selectable = false; 
     menuItem.ChildItems.Add(childItem); 
     AddChildItems(table, childItem); 
    } 
} 

如果是在Page_Load中做其他任务,要确保你写的菜单代码的开头,以便服务器菜单,然后作品开始处理在其他代码上。
希望这会有所帮助。

+0

是的,它不完美,但它看起来更好。我会执行它并分享错误,如果有的话。我觉得这个代码和建议更好。 – ITSagar