我有一个类似以下的列表视图:
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
提前致谢
答案 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