C#设置ListView项目子项目文本不显示

时间:2015-02-28 18:58:54

标签: c# winforms listview

我在这里失去了一点思绪。 当我最初构建一个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栏。

是什么给了什么?!

1 个答案:

答案 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" },
  });