2016-08-15 71 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