2010-09-03 114 views
1

我需要洗牌GridControl的數據源。我使用這個屬性在用戶控件:洗牌DevExpress GridControl數據源

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; 
     } 

奇怪的是,它似乎並沒有反映即使我在設置SongsDataSource方法後使用GridControl.RefreshDataSource()方法對GridControl所做的更改。如果我檢查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()結束gridControl.EndUpdate()防止任何更新到網格,而DataSource的元素正在改變。

+0

我傳遞的隨機()方法BindingSource.DataSource,仍然沒有任何反應,其中一個的BindingList 。在添加了BeginUpdate(),EndUpdate()方法之後,仍然沒有運氣調用RefreshDatasource()。 – 2010-09-07 08:42:35

+0

嘗試將List 設置爲DataSource,而不使用BindingList 。例如。 gridControl.DataSource = SongsDataSource。 – devnull 2010-09-07 08:50:44

+0

還會檢查您是否對任何列進行排序,因爲這會自動對網格中的記錄進行排序,並且洗牌將毫無用處。 – devnull 2010-09-07 09:04:46