我在这里失去了一点思绪。 当我最初构建一个ListView时,它完全按预期工作:
ListViewItem listViewItem = listView.Items.Add(model.Id.ToString(), model.Name, model.Id.ToString());
listViewItem.SubItems.AddRange(new ListViewItem.ListViewSubItem[]
{
new ListViewItem.ListViewSubItem() {Name = "ArtNr", Text = model.ArticleNumber},
new ListViewItem.ListViewSubItem() {Name = "Quantity", Text = "XXX"},
});
我在控件中定义了3个列,它们首先显示Name,ArticleNumber和" XXX",然后开始。
在稍后阶段,我必须更换" XXX"使用实际数据,并执行以下操作:
foreach (ListViewItem listViewItem in listView.Items)
{
InvoiceLine invoiceLine = FindInvoiceLine(...);
if (invoiceLine == null)
continue;
listViewItem.SubItems["Quantity"].Text = invoiceLine.Quantity.ToString();
}
我可以看到文本实际上是在正确的SubItem.Text中设置的,如果我稍后检查,同时通过不同的引用引用listview,即我知道我正在查看正确的对象。 然而,GUI并没有反映出变化,它仍然说" XXX"在第3栏。
是什么给了什么?!
答案 0 :(得分:4)
在挖掘源代码.NET Framework之后,我发现它确实存在 AddRange 方法的错误。他们忘记设置ListViewSubItem的所有者,因此在设置Text属性时文本没有更新。
您应该使用添加(ListViewSubItem)。
或使用带参数的subitem构造函数为其设置所有者。
listViewItem.SubItems.AddRange(new ListViewItem.ListViewSubItem[]
{
new ListViewItem.ListViewSubItem(listViewItem, model.ArticleNumber) {Name = "ArtNr" },
new ListViewItem.ListViewSubItem(listViewItem, "XXX") {Name = "Quantity" },
});