我在我的應用程序中使用了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。 –