2017-10-11 12 views
0

Nous développons des applications utilisant WPF, la conception matérielle et MS-Access 2007 comme Back End. Maintenant nous sommes confrontés à un problème d'application qui ralentit en ouvrant une vue unique, cette vue particulière a 16 combos qui se remplissent. Il prend 7 secondes pour le processus, le code suivant utilisé pour lier zone de liste déroulante item Sourcedélai lors de l'ouverture de vue dans l'application wpf

 List<ComboBind> values = new List<ComboBind>(); 
    try 
    { 
     using (var oleDbCommand = new OleDbCommand()) 
     { 
      oleDbCommand.CommandText = query ; 
      oleDbCommand.Connection = Connection.con; 
      var sql = query; 
      var oleDbDataReader = oleDbCommand.ExecuteReader(); 
     while (oleDbDataReader.Read()) 
      { 
       ComboBind b = new ComboBind(); 
        b.id = oleDbDataReader[0].ToString().ToInt(); 
        b.name = oleDbDataReader[1].ToString(); 
        values.Add(b);     
      }     
     } 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
+0

Étape 1. Brûlez 'Access' il est une source du mal pur! Étape 2. Post xaml de votre 'ComboBox'. J'espère que vous omettez l'implémentation 'INotifyPropertyChanged'. – XAMlMAX

+0

im utilisant FilteredComboBox deriverd de la classe combobox

+0

Il y a 2 possibilités ici: ** 1 ** votre requête à la base de données prend beaucoup de temps ou ** 2 ** vous avez de nombreux enregistrements à afficher sans que la virtualisation ne soit activée, ce qui entraîne la création d'un grand nombre d'éléments 'U'I. C'est maintenant à vous de découvrir quel est votre cas. Pourriez-vous également mettre ce code dans votre message. – XAMlMAX

Répondre

0

Il semble que vous essayez de charger des données dans thread d'interface utilisateur lors de l'initialisation vue et c'est la raison de la question. Soit le chargement des données dans le fil d'arrière-plan, soit le faire avant d'ouvrir la vue.

extrait de code simple pour le chargement des données dans la tâche séparée:

//Might be your view code behind or 
    //ViewModel if you are using MVVM 
    public class ViewCodeBehind 
    { 
     public List<ComboBind> ComboItems { get; set; } 

     public void Initialize() 
     { 
      //start bacground task for data loading 
      var comboQuery = "select *from data"; 
      Task.Run(() => LoadItems(comboQuery)); 
     } 

     public void LoadItems(string query) 
     { 
      List<ComboBind> values = new List<ComboBind>(); 
      try 
      { 
       using (var oleDbCommand = new OleDbCommand()) 
       { 
        oleDbCommand.CommandText = query; 
        oleDbCommand.Connection = Connection.con; 
        var sql = query; 
        var oleDbDataReader = oleDbCommand.ExecuteReader(); 
        while (oleDbDataReader.Read()) 
        { 
         ComboBind b = new ComboBind(); 
         b.id = oleDbDataReader[0].ToString().ToInt(); 
         b.name = oleDbDataReader[1].ToString(); 
         values.Add(b); 
        } 
       } 

       //use dispatcher to pass data back to UI thread 
       System.Windows.Threading.Dispatcher.CurrentDispatcher.BeginInvoke(
        new Action(() => 
        { 
         ComboItems = values; 
        })); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 
    } 
+0

merci @Skobarx pour une réponse rapide im nouveau dans WPF Juste commencé MVVM alors pouvez-vous expliquer comment pourrais-je éviter cela –

+0

@SachinJadhav, que voulez-vous dire par "éviter cela"? Si vous voulez dire des retards pendant le chargement des données, la réponse sera au-delà de ce sujet. – Skobarx

+0

System.Windows.Threading.Dispatcher.CurrentDispatcher.BeginInvoke ( new Action (() => { ComboItems = valeurs; })); fonctionne super ... vue ouverte en 2 secondes merci de votre aide –