Как обновить значения существующего элемента в ListView?

#vb.net #listviewitem

#vb.net #listviewitem

Вопрос:

Я работаю над небольшим проектом, и мне нужно добавить элемент с некоторыми значениями в ListView.
Я хочу иметь возможность обновлять значения элемента, если он будет добавлен снова, и не читать один и тот же элемент с разными деталями снова.

Ниже приведен код, который мне удалось придумать на данный момент:

 For Each item as ListViewItem in MainListView.Items
    If item.SubItems(0).Text = ItemCode Then
       item.SubItems(3).Text  = ItemQty
       item.SubItems(5).Text  = ItemPrice
    Else
       ' normal listview insert codes run here
    End If
Next
  

В нынешнем виде значения могут обновляться, только если элемент является первым в списке, но как только он перемещается на шаг вниз, аналогичный элемент также вставляется в ListView со своими собственными записями вместо поиска и обновления уже существующего.

Любая помощь по исправлению была бы с благодарностью принята. Спасибо.

Комментарии:

1. Я не уверен, что вы делаете в else части; в любом случае, попробуйте использовать For цикл, а не For Each (т. Е. не меняйте коллекцию во время ее итерации, если это то, что вы делаете сейчас).

2. Джими, часть else фактически выполняет вставку в ListView, если элемент еще не существует. В случае forloop, не могли бы вы любезно показать мне, как заставить его идентифицировать существующий элемент?

3. Какой язык вы на самом деле используете? Ваши теги содержат как VBA, так и VB.NET — это совершенно разные вещи. Ваш опубликованный код выглядит как .NET?

4. Извини, Тим, я думаю, это была оплошность. Я использую .NET

5. Это то же самое. Выполните итерацию от 0 к MainListView.Items.Count - 1 . Проверьте каждый элемент: If MainListView.Items[i].SubItems[0].Text = ItemCode Then (...) . Я понятия не имею, что вы добавляете, поскольку вы не опубликовали ничего, связанного с этим. Вероятно, у вас должен быть класс, который выполняет предварительный отбор / фильтрацию данных.

Ответ №1:

Повторите свою ListView проверку, существует ли ItemCode . Если он найден, обновите элемент и выйдите из подраздела с помощью инструкции Return. Можно использовать For Each , потому что вы не изменяете коллекцию, а только изменяете значения одного из элементов в коллекции. Если вы добавляли или удаляли элемент из ListView, вы не могли использовать For Each , потому что изменяется сама коллекция.

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    For Each item As ListViewItem In MainListView.Items
        If item.SubItems(0).Text = ItemCode Then
            item.SubItems(3).Text  = ItemQty
            item.SubItems(5).Text  = ItemPrice
            Return
        End If
    Next
    'Now if the For each fails doesn't find the record (fails to run the Return)
    ' normal listview insert codes run here
End Sub
  

Комментарии:

1. Миллион раз спасибо Мэри. Теперь это отлично работает в соответствии с вашими предложениями. Я очень благодарен. К сожалению, я не могу проголосовать за повышение, но я обязательно вернусь, чтобы сделать необходимое. Еще раз спасибо.