2010-09-03 2 views
1

Мне нужно перетасовать DataSource GridControl. Я использую это свойство в 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; 
     } 
    } 
} 

Затем я использую метод, который я клонировать, перетасовать и добавляемый к свойству 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; 
     } 

Странно то, что это, кажется, не отражает изменения в GridControl даже я использую метод GridControl.RefreshDataSource() после установки метода SongsDataSource. Если я проверю порядок DataSource, перетасование произошло успешно.

спасибо.

ответ

0

Поскольку вы изменили объект, первоначально установленный как источник данных, вызов RefreshDataSource() не принесет вам должной причины, вы не сможете обновить то, что больше не существует. Ваша проблема здесь:

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. 

Вы можете передать список как есть, без необходимости клонирования. Также окружайте вызов метода Shuffle() с gridControl.BeginUpdate() end gridControl.EndUpdate(), чтобы предотвратить любые обновления сетки при изменении элементов DataSource.

+0

Я передаю по методу Shuffle() в BindingSource.DataSource и до сих пор ничего не происходит, где является BindingList . Добавлены методы BeginUpdate(), EndUpdate() и после вызова RefreshDatasource() без везения. –

+0

попробуйте установить Список в качестве источника данных без использования BindingList . например. gridControl.DataSource = SongsDataSource. – devnull

+0

также проверьте, есть ли у вас сортировка по любому из столбцов, потому что это автоматически сортирует записи в вашей сетке, и перетасовка будет бесполезной. – devnull

0

У меня были такие проблемы с DevExpress GridControl. Я думаю, что эта ситуация вызвана GridView (http://documentation.devexpress.com/#WindowsForms/clsDevExpressXtraGridViewsGridGridViewtopic), который автоматически создается для каждого GridControl. Это часть GridControl, ответственная за визуализацию DataSource. Если вам нужно изменить DataSource попробовать:

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