我有点失去理智了。 当我最初构建 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 列,它们分别显示名称、文章编号和“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 并没有反射(reflect)变化,它在第三列中仍然显示“XXX”。
什么给了?!
最佳答案
在挖掘.NET Framework的源代码后,我发现这绝对是AddRange方法的错误。他们忘记设置 ListViewSubItem 的所有者,因此设置 Text 属性时文本没有更新。
您应该使用Add(ListViewSubItem)。
或使用带参数的子项构造函数为其设置所有者。
listViewItem.SubItems.AddRange(new ListViewItem.ListViewSubItem[]
{
new ListViewItem.ListViewSubItem(listViewItem, model.ArticleNumber) {Name = "ArtNr" },
new ListViewItem.ListViewSubItem(listViewItem, "XXX") {Name = "Quantity" },
});
关于C#设置ListView的Item的Subitem的文本不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28785580/