ListView删除带有匹配字段的行

时间:2017-01-24 10:26:50

标签: vb.net listview

我有一个类似以下的列表视图:

Name  | Gender | Age
---------------------
Name1 |   XX   | 23
Name2 |   XY   | 21
Name3 |   XY   | 25
Name4 |   XX   | 30

当列表视图被填充时,它会创建一个组合框的条目,如下所示:

If Not ComboBox4.Items.Contains(gender) Then
    ComboBox4.Items.Add(gender)
End If

所以我最终得到了一个带有2个条目(XX,XY)的组合框。现在我想删除与组合框中选择的性别匹配的所有。然后,选择的条目将从组合框中删除 示例:我选择要删除的性别“XX”,然后程序从列表视图中删除整个行,其中包含“name1,XX,23岁”和“name4,XX,30”。

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    for i = 1 to viewlist.items.count
        'Need help here to select the right column/viewlist-field
    next
    ComboBox4.Items.Remove(ComboBox4.Text)
End Sub

提前致谢

1 个答案:

答案 0 :(得分:1)

首先,您的循环应该从viewlist.Items.Count - 1开始,到0结束。这是因为To的右侧仅在第一次迭代之前进行评估。因此,在循环运行之前,循环将转到<{1}} 之前的,而不是删除项目后的实际情况(因此,为什么你从我的viewlist.Items.Count - 1获得了ArgumentOutOfRangeException以前的代码)。

从结尾开始并朝向0 i将始终表示有效索引,只要每次迭代最多删除一个项目。这可以通过以下方式说明:

First iteration    Second iteration    Third iteration    (and so on)
    Item 0             Item 0              Item 0
    Item 1             Item 1          (i) Item 1
    Item 2         (i) Item 2              [Removed]
(i) Item 3             [Removed]           [Removed]

现在,要获取项目的子列,您可以使用ListViewItem.SubItems property。您的Gender列当前位于索引1 - 第一个子项(索引0)显然是所有子项的所有者,即原始ListViewItem

For i = viewlist.Items.Count - 1 To 0 Step -1
    Dim CurrentSubItems As ListViewItem.ListViewSubItemCollection = viewlist.Items(i).SubItems
    If CurrentSubItems.Count >= 2 AndAlso CurrentSubItems(1).Text = ComboBox4.Text Then
        viewlist.Items.RemoveAt(i)
    End If
Next
ComboBox4.Items.Remove(ComboBox4.Text)

如果要使用不区分大小写的字符串比较,可以将循环中的If - 语句更改为:

If CurrentSubItems.Count >= 2 AndAlso String.Equals(CurrentSubItems(1).Text, ComboBox4.Text, StringComparison.OrdinalIgnoreCase) Then