正在更新ObjectListView中的项

本文关键字:ObjectListView 更新 | 更新日期: 2023-09-27 17:59:20

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

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以添加控件中不存在的任何新项,并更新那些已经存在的项。每条记录的唯一标识符是guid属性。

在我的timer-tick方法中,我调用以下代码;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);
        }
    }

正在更新ObjectListView中的项

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

 lvTransfers2.UpdateObject(item);

并不总是刷新列表视图。然而,这一直有效:

 lvTransfers2.RefreshObject(item);

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

您可以首先将列表绑定到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;
        }

我检查过了,每次都没有闪烁。希望这能帮助