2010-09-03 7 views
1

J'ai besoin de mélanger le DataSource de GridControl. J'utilise cette propriété dans un UserControl:Shuffle DevExpress GridControl DataSource

private List<Song> _songsDataSource; 
public List<Song> SongsDataSource 
{ 
    get { return _songsDataSource; } 
    set 
    { 
     _songsDataSource = value; 
     if (!value.IsNull()) 
     { 
      SongsBindingList = new BindingList<Song>(value); 
      songsBinding.DataSource = SongsBindingList; 
     } 
    } 
} 

Puis-je utiliser une méthode que je clone, lecture aléatoire et ajouter à la propriété SongsDataSource:

List<Song> newList = HelpClasses.Shuffle((List<Song>) SongsDataSource.Clone()); 
    SongsDataSource = newList; 

public static List<Song> Shuffle(List<Song> source) 
     { 
      for (int i = source.Count - 1; i > 0; i--) 
      { 
       int n = rng.Next(i + 1); 
       Song tmp = source[n]; 
       source[n] = source[i - 1]; 
       source[i - 1] = tmp; 
      } 
      return source; 
     } 

Chose étrange est qu'il ne semble pas refléter les modifications apportées à GridControl même j'utilise la méthode GridControl.RefreshDataSource() après avoir défini la méthode SongsDataSource. Si je vérifie l'ordre de DataSource, shuffle s'est passé avec succès.

Merci.

Répondre

0

Étant donné que vous avez modifié l'objet défini à l'origine en tant que DataSource, l'appel RefreshDataSource() ne sera pas utile car vous ne pourrez pas actualiser quelque chose qui n'est plus présent. Votre problème est ici:

List<Song> newList = HelpClasses.Shuffle((List<Song>) SongsDataSource.Clone()); 
SongsDataSource = newList; // the reference has changed, the grid doesn't know what to do when RefreshDataSource() is called. 

Vous pouvez passer la liste telle quelle, sans avoir besoin de la cloner. Entourez également l'appel de méthode Shuffle() avec gridControl.BeginUpdate() et gridControl.EndUpdate() pour empêcher toute mise à jour de la grille pendant que les éléments du DataSource changent.

+0

Je passe sur la méthode aléatoire() le BindingSource.DataSource et encore rien ne se passe, où est un BindingList . Ajouté les méthodes BeginUpdate(), EndUpdate() et après appelé RefreshDatasource() sans aucune chance encore. –

+0

essayez de définir la liste en tant que DataSource sans utiliser une liste de liens . par exemple. gridControl.DataSource = SongsDataSource. – devnull

+0

vérifiez également si vous avez trié sur l'une des colonnes, car cela trierait automatiquement les enregistrements dans votre grille et le brassage serait inutile. – devnull

0

J'ai eu de tels problèmes avec DevExpress GridControl. Je pense, que cette situation provoquée par GridView (http://documentation.devexpress.com/#WindowsForms/clsDevExpressXtraGridViewsGridGridViewtopic), qui crée automatiquement pour chaque GridControl. Cela fait partie de GridControl responsable de la visualisation de DataSource. Si vous devez changer essayer de DataSource:

GridView.Columns.Clear(); 
GridControl.DataSource = You_New_DataSource; 
GridView.RefreshData(); 
GridControl.RefreshDataSource();