К сожалению ListView
- странный зверь, и один из его странных углов состоит в том, что его предметы - это просто набор значений, которые нужно показать, по одному на каждый столбец.
Свойство Name
просто автоматизирует помещение чего-либо в первый столбец, и, к сожалению, это "что-то" находится в коллекции SubItems
.
Это означает, что если вы осмотрите коллекцию SubItems
, вы заметите, что в ней уже есть один элемент, и после задания имени элемента вы увидите, что текст этого элемента равен этому имени.
Это код свойства ListViewItem.Name
:
public string Name {
get {
if (SubItemCount == 0) {
return string.Empty;
}
else {
return subItems[0].Name;
}
}
set {
SubItems[0].Name = value;
}
}
И свойство ListViewSubItem.Name
выглядит так:
public string Name {
get {
return (name == null) ? "": name;
}
set {
name = value;
if (owner != null) {
owner.UpdateSubItems(-1);
}
}
}
Таким образом, очистка коллекции SubItems
имеет следствие очистки свойств этого первого элемента, как вы обнаружили, в дополнение к удалению всех остальных элементов из коллекции.
На самом деле происходит очистка коллекции, но любая попытка просмотреть коллекцию SubItems
, пока она пуста, приведет к созданию новой коллекции с одним элементом со значениями свойств по умолчанию. В приведенном выше примере кода чтение коллекции SubItems
будет автоматически назначать коллекцию с одним элементом внутреннему полю, если коллекция еще не существует.
Так что да, вот как это "работает".
Фактически, чтобы удалить все подэлементы, кроме первого, ваш цикл должен был бы быть:
while (item.SubItems.Count > 1)
item.SubItems.RemoveAt(1);