/ / C # paramètre le texte du sous-élément de l'élément ListView ne s'affiche pas - c #, winforms, listview

Paramètre C # Le texte du sous-élément de ListView ne s'affiche pas - c #, winforms, listview

Je perds un peu la tête ici. Lorsque je crée initialement un ListView, cela fonctionne totalement comme prévu:

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

J'ai 3 colonnes définies dans le contrôle, et elles affichent, respectivement, Nom, ArticleNumber et "XXX", pour commencer.

À un stade ultérieur, je dois remplacer "XXX" par les données réelles et procéder comme suit:

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

listViewItem.SubItems["Quantity"].Text = invoiceLine.Quantity.ToString();
}

Je peux voir que le texte est en train d'être placé dans leSubItem.Text approprié, même si je vérifie plus tard, tout en référençant la liste vue par une autre référence, c’est-à-dire que je sais que je regarde le bon objet. Cependant, l’interface graphique ne reflète pas le changement, elle indique toujours "XXX" dans la 3ème colonne.

Ce qui donne?!

Réponses:

3 pour la réponse № 1

Après avoir fouillé le code source .NET Framework, j’ai trouvé que c’était définitivement un bogue de AddRange méthode. Ils ont oublié de définir le propriétaire de ListViewSubItem. Le texte n'a donc pas été mis à jour lors de la définition de la propriété Text.

Tu devrais utiliser Ajouter (ListViewSubItem) au lieu.

ou utilisez le constructeur de sous-élément avec le paramètre pour en définir le propriétaire.

listViewItem.SubItems.AddRange(new ListViewItem.ListViewSubItem[]
{
new ListViewItem.ListViewSubItem(listViewItem, model.ArticleNumber) {Name = "ArtNr" },
new ListViewItem.ListViewSubItem(listViewItem, "XXX") {Name = "Quantity" },
});