重建列并向DataListView添加新数据集

时间:2014-10-27 09:26:45

标签: c# objectlistview

所以我使用BrightIdeasSoftware的DataListView变种作为我的c#项目。

我使用按钮来更改DataListView的视图。按下按钮时,执行以下操作:

olv.DataSource = null;

olv.AllColumns = colList;
olv.RebuildColumns();

//Fill OLV with data
olv.DataSource = dt;

第一个按钮创建1列并将视图更改为View.Tile;。

第二个按钮创建4列并将视图更改为View.Details;。

立即显示新列,但数据显示在列表中大约需要一秒钟。当我重建更多的列时,它需要更长的时间。

当我运行我的应用程序时,它会立即在View.Details中构建包含4列的视图。 只有当我从第一个按钮视图切换到第二个按钮视图时,它才会暂停。

在调试模式下,我注意到RebuildColumns()是挂起的。 但是如果我留下olv.DataSource = dt; out,立即执行RebuildColumns()之后的代码。

有人可以向我解释为什么会这样吗?

由于

1 个答案:

答案 0 :(得分:1)

首先,我不清楚您之间切换的列表是否使用相同的DataTable(我假设您的dt对象的类型)。如果source相同,则无需添加和删除列,您可以设置OLVColumn.IsVisible。那更快。

其次,设置ObjectListView.DataSource = null不会从列表中删除项目(您需要ObjectListView.ClearObjects),但是这样做会使内部DataSourceAdapter.CurrencyManager无效,这会阻止任何项目更新,直到再次专门设置ObjectListView.DataSource。设置数据源会将项目添加到列表中(调用ObjectListView.BuildList),如果您的源很大,这可能会很昂贵。

总结:

如果您只是在具有共享数据源的列表之间切换,那么:

foreach (var column in this.dataListView.AllColumns)
    column.IsVisible = true;
// call this only when tampering with columns
this.dataListView.RebuildColumns();
// if you need to add/remove items, same philosophy, partial instead of 
// complete update use filtering instead of DataSource reset

如果列表没有公共数据源,因此列完全不同,那么它是您必须支付的价格,重建列和项目,但您可以使用TabControl进行转义。您可以在列表之间切换,而无需一直重置DataSource。这应该是一次性体验。