在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