2014-09-12 3 views
1

В настоящее время я испытываю трудности с загрузкой Treeview. Мое приложение имеет центральную панель, в которой загружаются несколько пользовательских элементов управления. Каждый из них получил древовидную структуру из 5 родительских узлов (групп), владеющих десятками дочерних узлов (лиц) с общим количеством 50 узлов. Та же функция загружает древовидную структуру (см. Здесь): Первый цикл добавляет группы, а второй цикл (в первый) добавляет Лица.Медленная загрузка treeview

Эта функция занимает около 10 секунд для загрузки 50 узлов. Это вечность в моем мире.

Не знаю, что делать, чтобы улучшить этот. Пожалуйста, взгляните на эту функцию.

public static List<TreeNode> ArbreCommun(Guid idUser) 
    { 
     System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch(); 

     stopWatch.Start(); 


     List<TreeNode> ArbreParent = new List<TreeNode>(); 

     using (bdd_compactEntities contexte = new bdd_compactEntities()) 
     { 
      if (contexte.Groupe.Count() > 0) 
       foreach (Groupe grpItem in contexte.Groupe) 
       { 
        if (grpItem.g_nom == "Tous") 
        { 
         TreeNode Tous = new TreeNode(); 
         Tous.Text = grpItem.g_nom + " (" + contexte.Personne.Count() + ")"; 
         Tous.Tag = grpItem.id; 
         Tous.ToolTipText = "ID groupe = " + grpItem.id; 
         Tous.ImageKey = "group"; 
         Tous.SelectedImageKey = "group"; 

         foreach (Personne pers in FonctionsYou.ChargementPersonnesTous()) 
         { 
          TreeNode PersonneNode = new TreeNode(); 
          PersonneNode.Text = pers.p_nom + " " + pers.p_prenom; 
          PersonneNode.Tag = pers.id; 
          PersonneNode.ToolTipText = "ID personne = " + pers.id; 

          if (FonctionsYou.HasGroupe(idUser, FonctionsYou.GetGroupeIdPers(pers.id))) 
          { 
           if (FonctionsYou.CheckDisponibiliteAthlete(pers.id)) 
           { 
            PersonneNode.ForeColor = Color.Blue; 
            PersonneNode.ImageKey = "dispo"; 
            PersonneNode.SelectedImageKey = "dispo"; 
           } 
           else 
           { 
            PersonneNode.ForeColor = Color.Red; 
            PersonneNode.ImageKey = "blesse"; 
            PersonneNode.SelectedImageKey = "blesse"; 
           } 
          } 

          Tous.Nodes.Add(PersonneNode); 
         } 

         ArbreParent.Add(Tous); 
        } 
        else 
        { 
         TreeNode GroupeNode = new TreeNode(); 
         GroupeNode.Text = grpItem.g_nom + " (" + grpItem.Personne.Count() + ")"; 
         GroupeNode.Tag = grpItem.id; 
         GroupeNode.ToolTipText = "ID groupe = " + grpItem.id; 
         GroupeNode.ImageKey = "group"; 
         GroupeNode.SelectedImageKey = "group"; 
         if (FonctionsYou.HasGroupe(idUser, grpItem.id)) 
         { 
          GroupeNode.ForeColor = Color.Green; 
         } 

         foreach (Personne pers in contexte.Personne.Where(x => x.Groupe_id == grpItem.id)) 
         { 
          TreeNode PersonneNode = new TreeNode(); 
          PersonneNode.Text = pers.p_nom + " " + pers.p_prenom; 
          PersonneNode.Tag = pers.id; 
          PersonneNode.ToolTipText = "ID personne = " + pers.id; 

          if (FonctionsYou.HasGroupe(idUser, FonctionsYou.GetGroupeIdPers(pers.id))) 
          { 
           if (FonctionsYou.CheckDisponibiliteAthlete(pers.id)) 
           { 
            PersonneNode.ForeColor = Color.Blue; 
            PersonneNode.ImageKey = "dispo"; 
            PersonneNode.SelectedImageKey = "dispo"; 
           } 
           else 
           { 
            PersonneNode.ForeColor = Color.Red; 
            PersonneNode.ImageKey = "blesse"; 
            PersonneNode.SelectedImageKey = "blesse"; 
           } 
          } 

          GroupeNode.Nodes.Add(PersonneNode); 
         } 
         ArbreParent.Add(GroupeNode); 

        } 
       } 
     } 
     stopWatch.Stop(); 
     MessageBox.Show(stopWatch.ElapsedMilliseconds + " ms"); 
     return ArbreParent; 
    } 
+0

Вы уверены, что проблема в вас TreeView? Будет ли это намного быстрее, если вы прокомментируете все строки, где вы работаете с узлами, поддерживающими все внешние методы вызова, например. «FonctionsYou.HasGroupe», «FonctionsYou.GetGroupeIdPers» и т. Д.? – pkuderov

+0

Вы на самом деле правы, одна из них выполняет функции замедления sh * t из всего этого ... Я собираюсь это выработать. Благодарим вас за помощь! – You

+0

Спасибо, сэр, мне удалось спуститься с 10 секунд до одной секунды. – You

ответ

1

Кстати, вот мой метод вызова:

  List<TreeNode> _itemsNodes = FonctionsYou.ArbreCommun(userConnecte.uid); 
      treeview_arbre.ImageList = FonctionsYou.GetImageListTV(); 
      // Display a wait cursor while the TreeNodes are being created. 
      Cursor.Current = Cursors.WaitCursor; 

      // Suppress repainting the TreeView until all the objects have been created. 
      treeview_arbre.BeginUpdate(); 

      foreach (TreeNode node in _itemsNodes) 
      { 
       treeview_arbre.Nodes.Add(node); 
      } 

      // Reset the cursor to the default for all controls. 
      Cursor.Current = Cursors.Default; 

      // Begin repainting the TreeView. 
      treeview_arbre.EndUpdate(); 
Смежные вопросы