Trochę tu tracę rozum. Kiedy początkowo buduję ListView, działa on całkowicie zgodnie z oczekiwaniami:
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"},
});
Mam 3 kolumny zdefiniowane w formancie i wyświetlają kolejno Nazwa, Numer artykułu i "XXX".
Na późniejszym etapie muszę zastąpić "XXX" rzeczywistymi danymi i wykonać następujące czynności:
foreach (ListViewItem listViewItem in listView.Items)
{
InvoiceLine invoiceLine = FindInvoiceLine(...);
if (invoiceLine == null)
continue;
listViewItem.SubItems["Quantity"].Text = invoiceLine.Quantity.ToString();
}
Widzę, że Tekst faktycznie jest ustawiony wWłaściwego SubItem.Text, również jeśli sprawdzę później, podczas odwoływania się do listview poprzez inne odwołanie, tj. wiem, że patrzę na właściwy obiekt. Jednak GUI nie odzwierciedla zmiany, nadal mówi "XXX" w trzeciej kolumnie.
Co daje?!
Odpowiedzi:
3 dla odpowiedzi № 1Po wykopaniu kodu źródłowego .NET Framework stwierdziłem, że jest on zdecydowanie wadliwy AddRange metoda. Zapomnieli ustawić właściciela ListViewSubItem, więc tekst nie był aktualizowany podczas ustawiania właściwości Text.
Powinieneś użyć Dodaj (ListViewSubItem) zamiast.
lub użyj konstruktora podinementu z parametrem, aby ustawić dla niego właściciela.
listViewItem.SubItems.AddRange(new ListViewItem.ListViewSubItem[]
{
new ListViewItem.ListViewSubItem(listViewItem, model.ArticleNumber) {Name = "ArtNr" },
new ListViewItem.ListViewSubItem(listViewItem, "XXX") {Name = "Quantity" },
});