2016-08-15 4 views
2

ASP.NetでC#を使用すると、データベースからASP.Netメニューコントロールを動的に読み込み中です。私はそれらの下にいくつかの子アイテムを持っているそれらのアイテムを使用不能にしようとしています。これは、親メニュー項目をクリックしたときにマウスを持ってはいけないモバイルでは、必ずポストバックの代わりに子アイテムを取得することになります。下のコードはうまくいきますが、欠点がありますが、ロードに時間がかかりすぎて、すべてのアイテム(すべての親+すべての子)を1つのビューに垂直に表示すると、悪い結果が表示されます。データベース駆動メニューが遅すぎる

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説明it itelfで述べたように、:::「ロードするには時間がかかり、すべてのアイテム(すべての親+すべての子)を1つのビューに垂直に表示すると悪い結果が表示されます。ページがロードされると、ツリー/階層のないすべての親アイテムと子アイテムを含む完全なメニューが垂直に表示されます。次に、階層的なメニューの形を取り、正常に調整されます。このプロセスには時間がかかり、ユーザーのインプレッションが悪くなります。私はコードをデバッグし、oopsが何回も実行されていることが分かり、処理時間が増えました。 – ITSagar

答えて

1

データベース駆動型メニューでは、初めて読み込むときに遅れが発生し、Webサーバーの速度にもよります。あなたはPage_Loadの上で他のタスクを行っている場合は、

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

サーバはメニューで処理を開始してから動作するようにあなたが最初のメニューコードを記述します:ただし、次のコードは、ロード時間を減らすのに役立ちます他のコードで。
これが役に立ちます。

+0

ええ、それは完璧ではありませんが、それはまだよく見えます。私はそれを実装し、エラーがあればそれを共有します。私はこのコードと推奨事項を見つけました。 – ITSagar