C# 重建列并向DataListView添加新数据集
因此,我在我的c#项目中使用了BrightIdeasSoftware的DataListView变体 我使用按钮更改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.
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
来逃避。您可以在列表之间切换,而无需一直重置数据源。那应该是一次性的经历