Vb.net ListView删除带有匹配字段的行
我有一个列表视图,如下所示:Vb.net ListView删除带有匹配字段的行,vb.net,listview,Vb.net,Listview,我有一个列表视图,如下所示: Name | Gender | Age --------------------- Name1 | XX | 23 Name2 | XY | 21 Name3 | XY | 25 Name4 | XX | 30 当listview被填充时,它会创建一个组合框条目,如下所示: If Not ComboBox4.Items.Contains(gender) Then ComboBox4.Items.Add(gender) En
Name | Gender | Age
---------------------
Name1 | XX | 23
Name2 | XY | 21
Name3 | XY | 25
Name4 | XX | 30
当listview被填充时,它会创建一个组合框条目,如下所示:
If Not ComboBox4.Items.Contains(gender) Then
ComboBox4.Items.Add(gender)
End If
最后我得到了一个包含两个条目XX,XY的组合框。现在我想删除与组合框中选择的性别匹配的所有行。然后,选择的条目将从组合框中删除。
示例:我选择要删除的性别“XX”,然后程序从列表视图中删除带有“name1,XX,age 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
首先,您的循环应该从viewlist.Items.Count-1开始,并在0结束。这是因为To的右侧仅在第一次迭代之前进行评估。因此,循环将转到运行循环之前的viewlist.Items.Count-1,而不是删除项之后的实际值,这就是为什么从我以前的代码中获得ArgumentOutOfRangeException 只要每次迭代最多删除一项,从末尾开始到0,我将始终表示一个有效索引。这可以通过以下内容来说明: 第一次迭代第二次迭代第三次迭代,依此类推 项目0项目0项目0项目0 项目1项目1 i项目1 第2 i项第2项[已删除] i第3项[已删除][已删除] 现在,要获取项目的子列,可以使用。您的性别列当前位于索引1处-第一个子项索引0显然是所有子项的所有者,即原始ListViewItem 如果要使用不区分大小写的字符串比较,可以将循环中的If语句更改为:
If CurrentSubItems.Count >= 2 AndAlso String.Equals(CurrentSubItems(1).Text, ComboBox4.Text, StringComparison.OrdinalIgnoreCase) Then
这将抛出异常System.ArgumentOutOfRangeException和其他信息:InvalidArgument=索引值为1的值无效。@neverlucky:这很奇怪。。。抛出异常时i的值是多少?我能给出的唯一解释是,您有一个没有子项的ListViewItem。每当我尝试Msgboxviewlist.items.count时,它显示的数字远远大于viewlist中的实际条目数。是否可以忽略没有子项的ListViewItem?是否确实有效?程序现在总是通过viewlist.Itemsi.SubItems水平计数3,而不是垂直计数条目数。所以它总是显示3,不管我加多少XX或XY人。是这样吗?即使我有20个条目,它也只删除3个,因为它只读取了我希望您理解的列的数量mean@neverlucky:我不知道你的意思,不。。。我还没有测试代码,因为我没有访问计算机的权限,但是代码会进行检查,以便至少有两个子项0:所有者,1:性别列,并且应该删除每个项目,其中性别列是您在组合框中选择的项目。-不过我很快就能试试这个了。
If CurrentSubItems.Count >= 2 AndAlso String.Equals(CurrentSubItems(1).Text, ComboBox4.Text, StringComparison.OrdinalIgnoreCase) Then