2016-07-29 82 views
0

我在我的應用程序中使用了ObjectListView控件。每隔1秒鐘,我都有一個計時器打勾並刷新TransferMetricsList<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); 
     } 
    } 
+0

UpdateObject()怎麼樣? - 「將給定的模型對象更新到ListView中,如果模型不存在,將添加模型。」默認情況下,OLV通過引用檢查模型對象是否相等,因此請確保您繼續使用相同的實例。還有UpdateObjects(),所以也許你可以只添加新的項目到你的List <>中,並在UpdateObjects()改變時提供給它。 –

+0

使用UpdateObjects()會在每次計時器滴答時添加新條目。 – Sam

+0

那麼你可能會不斷創建items/list的新實例?!也許有一種方法可以爲OLV實現自定義的相等比較器,所以你可以使用你的GUID。 –

回答

0

你可以先綁定列表objectlistview

if (classes == null) classes = new List<myClass>(); 
      objectListView1.SetObjects(classes); 
      timer1.Interval = 1000; 
      timer1.Start(); 

在計時器的滴答事件必須添加新對象列出並生成列表:

private void timer1_Tick(object sender, EventArgs e) 
     { 
      myClass class1 = new myClass(); 
      class1.Description = i.ToString(); 
      classes.Add(class1); 

      objectListView1.BuildList(true); 

      ++i; 
     } 

我會檢查它每次都不閃爍。希望這可以幫助

+0

這不太合適。我通過執行以下操作來設置對象列表; 'activeTransfers = uploadManager.GetTransferMetrics();''GetTransferMetrics'返回一個'List '。因此,不是像上面的例子那樣添加'activeTransfers',而是直接分配'activeTransfers'。 – Sam

+0

objectlistview.setobjects將重建整個列表,您可以在屏幕上觀察,而olv.buildlist()只是靜靜地執行。你嘗試使用objectListView1.SetObjects(activeTransfers);一次然後activeTransfers = uploadManager.GetTransferMetrics();和objectListView1.BuildList(true);在計時器事件? –

+0

是的,我做了,它不起作用 - 項目永遠不會添加到列表視圖。我想這必須是ObjectListView的限制。 – Sam