InvalidArgument ='的值'不适用于' index' (''内部号码)

时间:2016-11-04 02:27:36

标签: vb.net

这是我的第一个问题。我无法解决这个错误2周。 为了解决注册问题。 这是我的vb代码。

Try
    For i As Integer = 0 To ListBox1.Items.Count - 1 Step 1
        For j As Integer = 0 To ListBox2.Items.Count - 1 Step 1
            If ListBox1.Items(i).ToString().Equals(ListBox2.Items(j).ToString()) = True Then
                ListBox1.Items.RemoveAt(i)
            End If
        Next
    Next
Catch ex As Exception
    MsgBox("LOAD ERROR: " + ex.Message, vbCritical, "ERROR")
End Try

错误:

  

InvalidArgument =' 20'的值不适用于' index'(''是变量。)

项目没有问题,除了这个错误

5 个答案:

答案 0 :(得分:3)

试试这个:

Dim items = ListBox1.Items.Where(Function(item) ListBox2.Items.Contains(item)).ToList()
For Each item in items
    ListBox1.Remove(item)
Next

答案 1 :(得分:1)

当我运行你的代码时,我收到一个不同的异常,超出范围的参数......这是因为当你重复遍历它时从索引集合中删除项目。例如,让我们说listbox1中有10个项目。如果您在listbox2中找到项目编号1并将其删除,那么现在您在listbox1中只剩下9个项目。问题是,当你进入你的循环时,你告诉它循环10个项目,它仍然会尝试这样做。在某些时候,如果删除任何项目,此循环将抛出异常...所以您需要迟早更改它。要缓解这种情况,请逐步执行您将向后删除项目的集合,如下所示:

For i As Integer = ListBox1.Items.Count - 1 to 0 Step -1

当我使用上面显示的更改运行代码时,它按预期工作,并从listbox1中删除重复的项目。不幸的是,我无法重现您的无效参数异常。很奇怪,因为通常该异常喜欢在使用listviews时弹出,而不是列表框。也许您可以编辑帖子并在列表框中添加数据屏幕截图,以便其他人更容易排除故障。

答案 2 :(得分:0)

当您从ListBox1中删除项目时,总项目数量会减少(显然),但For循环不会尊重该项目。 For循环只会将To的右侧设置一次,这是在第一次迭代之前完成的。

您目前正在做的事情实际上与此相同:

Dim a As Integer = ListBox1.Items.Count - 1
For i As Integer = 0 To a Step 1

    Dim b As Integer = ListBox2.Items.Count - 1
    For j As Integer = 0 To b Step 1
        ...
    Next

Next

对此的修复很简单;创建一个变量,其中包含您已移除的项目数,然后在If语句中,检查i是否大于或等于当前项目数量减去您的项目数量删除了。如果是这样,退出循环。

Dim ItemsRemoved As Integer = 0
For i As Integer = 0 To ListBox1.Items.Count - 1 Step 1
    If i >= ListBox1.Items.Count - ItemsRemoved Then Exit For

    For j As Integer = 0 To ListBox2.Items.Count - 1 Step 1
        If ListBox1.Items(i).ToString().Equals(ListBox2.Items(j).ToString()) = True Then
            ListBox1.Items.RemoveAt(i)
        End If
    Next
Next

为了将来参考,您还应该始终删除/注释掉Try/Catch - 语句,这样您就可以看到 发生错误的位置,并获得更多详细信息。

答案 3 :(得分:0)

我的回答是,当你迭代任何集合时,你不应该尝试修改这个集合。在for-loops你遇到了这样的麻烦。但您可以使用while-loop进行迭代而不会出现问题

Try
    Dim index As Integer = 0
    While index < ListBox1.Items.Count '!! this code based on fact that ListBox1 item Count changes
        For j As Integer = 0 To ListBox2.Items.Count - 1 ' <- this is ok because ListBox2 doesn't chage
            If string.Equals(ListBox1.Items(index).ToString(), ListBox2.Items(j).ToString()) Then
                ListBox1.Items.RemoveAt(index)
                Continue While ' no index increase here because if you remove item N, next item become item N
            End If
        Next
        index += 1
    End While
Catch ex As Exception
    MsgBox("LOAD ERROR: " + ex.Message, vbCritical, "ERROR")
End Try

这是事物实际运作的一个很好的例子。它显示了一些技巧

答案 4 :(得分:0)

我刚刚选择Build-> Clean解决方案,它清除了不良元素。这是由于添加和删除菜单项而不删除已删除菜单项的子例程而发生的。一旦我清洗了解决方案,然后运行了项目,错误就消失了。