更新 ObjectListView 中的项目
Updating items in a ObjectListView
我在我的应用程序中使用 ObjectListView
控件。每隔 1 秒,我就有一个计时器滴答作响,并刷新类型为 TransferMetrics
(List<TransferMetrics> activeTransfers
) 的 List
。我的 TransferMetrics
class 看起来像这样;
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
属性。
在我的计时器滴答方法中,我调用了以下代码; lvTransfers2.SetObjects(activeTransfers);
。这有效,但它会导致控件 "flash",即删除所有项目并重新绘制它们。
实现我想要实现的目标的优雅方式是什么?我希望将 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
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;
}
我已经检查过了,每次都没有闪烁。希望这有帮助
可能有点晚了,但我也 运行 进入了这个问题,我发现
lvTransfers2.UpdateObject(item);
并不总是刷新列表视图。然而,这一直有效:
lvTransfers2.RefreshObject(item);
RefreshObject(..) 将在必要时添加项目,否则使用传递的对象的内容刷新行。
我在我的应用程序中使用 ObjectListView
控件。每隔 1 秒,我就有一个计时器滴答作响,并刷新类型为 TransferMetrics
(List<TransferMetrics> activeTransfers
) 的 List
。我的 TransferMetrics
class 看起来像这样;
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
属性。
在我的计时器滴答方法中,我调用了以下代码; lvTransfers2.SetObjects(activeTransfers);
。这有效,但它会导致控件 "flash",即删除所有项目并重新绘制它们。
实现我想要实现的目标的优雅方式是什么?我希望将 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
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;
}
我已经检查过了,每次都没有闪烁。希望这有帮助
可能有点晚了,但我也 运行 进入了这个问题,我发现
lvTransfers2.UpdateObject(item);
并不总是刷新列表视图。然而,这一直有效:
lvTransfers2.RefreshObject(item);
RefreshObject(..) 将在必要时添加项目,否则使用传递的对象的内容刷新行。