更新 ObjectListView 中的项目

Sam*_*Sam 0 c# objectlistview

我正在ObjectListView我的应用程序中使用该控件。每隔 1 秒,我就有一个计时器滴答作响,并刷新( )List类型。我的班级是这样的;TransferMetricsList<TransferMetrics> activeTransfersTransferMetrics

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; }
}
Run Code Online (Sandbox Code Playgroud)

每隔 1 秒,我想更新一次ObjectListView以添加控件中尚不存在的任何新项目,并更新那些已经存在的项目。每条记录的唯一标识符是属性guid

在我的计时器滴答方法中,我调用以下代码;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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

小智 5

可能有点晚了,但我也遇到了这个问题,我发现

 lvTransfers2.UpdateObject(item);
Run Code Online (Sandbox Code Playgroud)

并不总是刷新列表视图。然而这始终有效:

 lvTransfers2.RefreshObject(item);
Run Code Online (Sandbox Code Playgroud)

RefreshObject(..) 将在必要时添加该项目,否则使用传递对象的内容刷新该行。