2016-08-15 4 views
2

in ASP.Net mit C#, Ich bevölkere eine ASP.Net Menüsteuerung aus der Datenbank dynamisch. Ich versuche, diese Gegenstände unbrauchbar zu machen, die einige Kindergegenstände darunter haben. Damit wird sichergestellt, dass auf Mobilgeräten, bei denen wir keine Maus zum Überfahren haben, beim Anklicken des übergeordneten Menüelements der Benutzer sicher Kindelemente anstelle eines Postbacks erhält. Der folgende Code funktioniert gut, aber mit einem Nachteil, es dauert zu viel Zeit zu laden und in der Zwischenzeit zeigt ein schlechtes Ergebnis durch die Anzeige aller Elemente (alle Eltern + alle Kind) vertikal in einer einzigen Ansicht.Datenbankgesteuerte Menü ist zu langsam

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

Kann dieser Prozess mit einer anderen Code-Implementierung schneller und zuverlässiger durchgeführt werden?

+0

Wie langsam ist zu langsam? Welcher Teil des Codes ist langsam? – Bert

+0

@Bert Evans Wie in der Beschreibung selbst erwähnt, ::: "es dauert zu viel Zeit zu laden und in der Zwischenzeit zeigt ein schlechtes Ergebnis durch die Anzeige aller Elemente (alle Eltern + alle Kind) vertikal in einer einzigen Ansicht." Wenn die Seite geladen wird, wird das vollständige Menü vertikal einschließlich aller übergeordneten und untergeordneten Elemente ohne Baum/Hierarchie angezeigt. Dann nimmt es die Form eines hierarchischen Menüs an und passt sich normal an. Dieser Prozess benötigt Zeit und die Nutzerimpressionen werden schlecht. Ich debuggte den Code und stellte fest, dass der Oops zu oft ausgeführt wird und die Verarbeitungszeit somit höher ist. – ITSagar

Antwort

1

Das datenbankgesteuerte Menü wird sicherlich eine Verzögerung beim ersten Laden anzeigen und hängt auch von der Geschwindigkeit Ihres Webservers ab. Allerdings wird der folgende Code, den Sie bei der Verringerung der Ladezeit helfen:

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

Wenn Sie andere Aufgaben auf page_load tun, stellen Sie sicher, dass Sie das Menü Code am Anfang schreiben, so dass Server die Verarbeitung mit Menü und dann Arbeiten beginnt auf anderem Code.
Hoffe, das hilft.

+0

Ja, es ist nicht perfekt, aber es sieht immer noch besser aus. Ich werde es implementieren und gegebenenfalls Fehler teilen. Ich finde diesen Code und die Empfehlung besser. – ITSagar