2017-10-10 6 views
0

Mise à jour: J'ai redémarré mon ordinateur et il n'est pas aussi lent que 500 millisecondes, mais il faut environ 40 millisecondes juste pour montrer le contexte menu, je l'ai comparé au menu natif Winforms (qui est plus rapide). En outre, j'ai déjà vérifié en réglant les horodatages que MyGridMenu.Show est le goulot d'étranglement ici, une fois qu'il est commenté, l'ensemble des fonctions prend presque pas de temps. Je suis en train d'écrire une application basée sur Devexpress xGrid, et j'ai besoin de personnaliser le menu contextuel. J'ai utilisé l'extrait de code suivant et l'appel de fonction .Show est vraiment long (500ms). Ce niveau de lenteur est intolérable pour une application native, mais je suis vraiment nouveau sur C#, Winforms, etc. et je n'ai plus d'idées. Est-ce que quelqu'un sait ce qui pourrait être le coupable?DevExpress.XtraGrid.Menu apparaît très lentement (par rapport au menu contextuel Winforms natif)

private void gridControl1_MouseUp(object sender, MouseEventArgs e) 
    { 
     Console.WriteLine("Detected your mouse up event!"); 
     var start = DateTime.Now; 
     GridView view = sender as GridView; 
     if (e.Button == MouseButtons.Right) 
     { 
      DevExpress.XtraGrid.Views.Grid.ViewInfo.GridHitInfo hi = view.CalcHitInfo(new Point(e.X, e.Y)); 

      if (!hi.InColumnPanel) 
      { 
       var MyGridMenu = new ExternalManagerContextualMenuView(view) 
       { 
         MyDataStore = this.MyDataStore 
       }; 
       MyGridMenu.Init(hi); 
       MyGridMenu.Show(hi.HitPoint); 
      } 
      var end = DateTime.Now; 
      Console.WriteLine($"Showing this thing takes {end - start} time"); 
     } 
    } 
+1

Vous devrez expliquer ce qu'est 'ExternalManagerContextualMenuView' et' this.MyDataStore'? Je soupçonne que la partie la plus lente ici est la liaison de données personnalisée et non le composant lui-même. –

+0

Ce n'est pas ça, j'ai vérifié que c'est MyGridMenu.Show() 'qui est lent en définissant des horodatages pour chaque ligne. – benjaminz

+0

Avez-vous essayé de parcourir votre source de données séparément? Sinon, il ne vérifie rien, avant que l'appel à 'Show' vous n'attribuez qu'une référence à la source de données, la récupération des données réelles se passe sur l'affichage. Et vous devez toujours expliquer ce qu'est 'ExternalManagerContextualMenuView'. –

Répondre

0

GridView fournit l'événement PopupMenuShowing qui vous permet d'ajouter vos éléments de menu personnalisés. Dans ce cas, vous n'aurez pas besoin de gérer l'événement MouseUp.

Quant au problème de latence, il est probable qu'elle est causée par le code suivant:

var MyGridMenu = new ExternalManagerContextualMenuView(view) 
{ 
     MyDataStore = this.MyDataStore 
}; 
MyGridMenu.Init(hi); 
MyGridMenu.Show(hi.HitPoint); 

Vous pouvez mesurer combien de temps ces lignes prennent en utilisant Chronomètre.

Stopwatch sw = new Stopwatch(); 
sw.Start(); 
//your code 
sw.Stop(); 
Debug.WriteLine(sw.ElapsedMilliseconds.ToString());