我在我的应用程序中使用了ObjectListView
控件。每隔1秒钟,我都有一个计时器打勾并刷新TransferMetrics
(List<TransferMetrics> activeTransfers
)类型的List
。我的TransferMetrics
类看起来像这样;更新ObjectListView中的项目
class TransferMetrics
{
public Guid guid { get; set; }
public string jobName {get; set;}
public int TotalTransferred {get; set;}
public int TotalToTransfer { get; set; }
public int TotalFailed { get; set; }
public DateTime TimeStarted { get; set; }
public string status { get; set; }
//Used for single file uploads only
public double percentage { get; set; }
public int cps { get; set; }
//used for database transfers
public string dbPath { get; set; }
public bool restoreDatabase { get; set; }
public string dbName { get; set; }
public DocsToTransferBundle docsBundle { get; set; }
public bool databaseRestored {get; set;}
public bool dbRestoreInProgress { get; set; }
public List<FailedUploadsBundle> FailedUploadDetails { get; set; }
}
每隔1秒,我想更新ObjectListView
补充说,不控制已经存在的任何新项目,并更新那些已经做。每个记录的唯一标识符是属性。
在我的计时器滴答法中,我打电话给下面的代码; lvTransfers2.SetObjects(activeTransfers);
。这是有效的,但它会导致控件“闪现”,即删除所有项目并重新绘制它们。
什么是优雅的方式来做我想达到的目的?我想要将List
中的任何新实例添加到控件中,并且要更新任何现有项目。
我的第二次尝试是这样的;
var at = uploadManager.GetTransferMetrics();
foreach(var a in at)
{
var item = activeTransfers.Where(x => x.guid == a.guid).FirstOrDefault();
if (item != null)
{
lvTransfers2.UpdateObject(item);
//item = a;
}
else
{
activeTransfers.Add(a);
}
}
UpdateObject()怎么样? - “将给定的模型对象更新到ListView中,如果模型不存在,将添加模型。”默认情况下,OLV通过引用检查模型对象是否相等,因此请确保您继续使用相同的实例。还有UpdateObjects(),所以也许你可以只添加新的项目到你的List <>中,并在UpdateObjects()改变时提供给它。 –
使用UpdateObjects()会在每次计时器滴答时添加新条目。 – Sam
那么你可能会不断创建items/list的新实例?!也许有一种方法可以为OLV实现自定义的相等比较器,所以你可以使用你的GUID。 –