我需要洗牌GridControl的DataSource。我在UserControl中使用此属性:
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的更改,即使我在设置SongsDataSource方法后使用GridControl.RefreshDataSource()方法。如果我检查DataSource订单,则成功发生了shuffle。
谢谢。
答案 0 :(得分:0)
由于您已经更改了最初设置为DataSource的对象,因此调用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
的元素发生变化时对网格进行任何更新。
答案 1 :(得分: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();