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

C# 重建列并向DataListView添加新数据集,c#,objectlistview,C#,Objectlistview,因此,我在我的c#项目中使用了BrightIdeasSoftware的DataListView变体 我使用按钮更改DataListView的视图。按下按钮时,执行以下操作: olv.DataSource = null; olv.AllColumns = colList; olv.RebuildColumns(); //Fill OLV with data olv.DataSource = dt; 第一个按钮创建一列并将视图更改为view.Tile 第二个按钮创建4列并将视图更改为view.

因此,我在我的c#项目中使用了BrightIdeasSoftware的DataListView变体

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

olv.DataSource = null;

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

//Fill OLV with data
olv.DataSource = dt;
第一个按钮创建一列并将视图更改为view.Tile

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

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

当我运行应用程序时,它会在视图中构建包含4列的视图。详细信息会立即显示。 只有当我从第一个按钮视图切换到第二个按钮视图时,它才会挂起一会儿

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

有人能给我解释一下为什么会这样吗


谢谢

首先,我不清楚您正在切换的列表是否使用相同的
DataTable
(我假设这就是您的
dt
对象的类型)。如果源代码相同,则无需添加和删除列,可以设置
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
来逃避。您可以在列表之间切换,而无需一直重置数据源。那应该是一次性的经历