C#设置ListView的Item的Subitem的文本不显示

Yur*_*ouk 2 c# listview winforms

我在这里有点失去理智了。当我最初构建 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"},
  });
Run Code Online (Sandbox Code Playgroud)

我在控件中定义了 3 列,它们分别显示名称、文章编号和“XXX”。

在稍后阶段,我必须用实际数据替换“XXX”,并执行以下操作:

foreach (ListViewItem listViewItem in listView.Items)
  {
    InvoiceLine invoiceLine = FindInvoiceLine(...);
    if (invoiceLine == null)
        continue;

    listViewItem.SubItems["Quantity"].Text = invoiceLine.Quantity.ToString();
  }
Run Code Online (Sandbox Code Playgroud)

我可以看到文本实际上被设置在正确的 SubItem.Text 中,如果我稍后检查,同时通过不同的引用引用列表视图,即我知道我正在查看正确的对象。然而 GUI 并没有反映变化,它在第三列中仍然显示“XXX”。

是什么赋予了?!

Kev*_*Bui 6

在挖掘.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" },
  });
Run Code Online (Sandbox Code Playgroud)