2016-07-29 51 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