【问题标题】:ListView delete line with matching fieldListView 删除具有匹配字段的行
【发布时间】:2017-01-24 10:26:50
【问题描述】:

我有一个如下的列表视图:

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)的组合框。现在我想删除与组合框中选择的性别匹配的所有 lines。然后从组合框中删除选定的条目。
示例:我选择要删除的性别 '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

提前致谢

【问题讨论】:

    标签: vb.net listview


    【解决方案1】:

    首先,您的循环应该从viewlist.Items.Count - 1 开始并在0 结束。这是因为To 的右侧仅在第一次迭代之前进行评估。因此,循环将转到循环运行 之前 的任何 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-statement 更改为:

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

    【讨论】:

    • 这会引发异常“System.ArgumentOutOfRangeException”以及附加信息:InvalidArgument=Value with value 1 for index is invalid.
    • @neverlucky :这很奇怪......抛出异常时i 的值是多少?我能想到的唯一解释是你有一个没有子项目的ListViewItem
    • 每当我尝试Msgbox(viewlist.items.count) 时,它显示的数字远远大于视图列表中的条目数量。没有子项可以忽略ListViewItem吗?
    • 你确定这行得通吗?该程序现在始终计算 3(水平)到 viewlist.Items(i).SubItems,而不是条目数(垂直)。所以它总是显示3,无论我添加多少 XX 或 XY 人。这是正确的吗?即使我有 20 个条目,它也只会删除 3 个,因为它只是读取列的数量(我希望你明白我的意思)
    • @neverlucky :我不确定你的意思,不......我还没有测试过代码,因为我无法使用计算机,但是代码检查以确保至少有两个子项(0:所有者,1:Gender 列)并且应该删除每个项,其中Gender 列是您在ComboBox 中选择的。 -- 不过我很快就能试试这个。
    猜你喜欢
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 2017-10-20
    • 1970-01-01
    • 2014-05-12
    • 1970-01-01
    相关资源
    最近更新 更多