所以我使用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()之后的代码。
有人可以向我解释为什么会这样吗?
由于
答案 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。这应该是一次性体验。