System.ArgumentOutOfRangeException 是啥意思? (vb.net)

Posted

技术标签:

【中文标题】System.ArgumentOutOfRangeException 是啥意思? (vb.net)【英文标题】:What does the System.ArgumentOutOfRangeException mean? (vb.net)System.ArgumentOutOfRangeException 是什么意思? (vb.net) 【发布时间】:2013-03-29 13:45:55 【问题描述】:

我遇到了 “在 mscorlib.dll 中发生了“System.ArgumentOutOfRangeException”类型的第一次机会异常异常,它正在影响我的程序。这是我的代码。下面是我对代码的文字总结。

Private Sub Group_LeaderTextBox_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles Group_LeaderTextBox.LostFocus
    Dim ListCounter As Integer
    Dim Checker As Integer = 0
    Dim NewString As String

    If Group_LeaderTextBox.Text <> "" Then
        If ListBox_ParticipantsNames.Items.Count = 0 Then
            ListBox_ParticipantsNames.Items.Add(Group_LeaderTextBox.Text & " (Group Leader)")
        Else
            For ListCounter = 0 To ListBox_ParticipantsNames.Items.Count - 1
                If ListBox_ParticipantsNames.Items.Item(ListCounter).ToString.Substring(0) = Group_LeaderTextBox.Text Then
                    If ListBox_ParticipantsNames.Items.Item(0).ToString.Substring(ListBox_ParticipantsNames.Items.Item(0).ToString.Length - 14) = "(Group Leader)" Then
                        NewString = ListBox_ParticipantsNames.Items.Item(0).ToString.Replace(" (Group Leader)", "")
                        ListBox_ParticipantsNames.Items.RemoveAt(0)
                        ListBox_ParticipantsNames.Items.Insert(0, NewString)
                    End If
                    ListBox_ParticipantsNames.Items.RemoveAt(ListCounter)
                    ListBox_ParticipantsNames.Items.Insert(0, Group_LeaderTextBox.Text & " (Group Leader)")
                    Exit For
                Else
                    Checker += 1
                End If
            Next

            If Checker = ListBox_ParticipantsNames.Items.Count Then
                If ListBox_ParticipantsNames.Items.Item(0).ToString.Substring(ListBox_ParticipantsNames.Items.Item(0).ToString.Length - 14) = "(Group Leader)" Then
                    ListBox_ParticipantsNames.Items.RemoveAt(0)
                    ListBox_ParticipantsNames.Items.Insert(0, Group_LeaderTextBox.Text & " (Group Leader)")
                Else
                    ListBox_ParticipantsNames.Items.Insert(0, Group_LeaderTextBox.Text & " (Group Leader)")
                End If
            End If
        End If
    Else
        If ListBox_ParticipantsNames.Items.Item(0).ToString.Substring(ListBox_ParticipantsNames.Items.Item(0).ToString.Length - 14) = "(Group Leader)" Then
            ListBox_ParticipantsNames.Items.RemoveAt(0)
        End If
    End If
End Sub

因此,此代码用于在文本框“Group_LeaderTextBox”(我们称之为“X”)失去焦点时向列表框添加值。

逻辑是这样的(按照编写代码的顺序):

但首先,有一些先决条件:

有两种方法可以将项目添加到列表框中,一种是通过 X(它失去焦点),第二种是通过另一个文本框(我们称之为“Y”)。 (不重要) X 中添加到列表框中的所有文本首先出现在列表框中,无论列表框中已经存在什么。 来自 X 的文本,比如“John”,当添加到列表框时,将显示添加的字符串“(组长)”。因此,在失去焦点时,“John”将显示为“John (Group Leader)”。请记住,也可以有来自 Y 的输入,但是来自 Y 的输入只是它包含的文本。 如果(失去焦点时)X 为空,则如果列表框中的第一项包含子字符串“(组长)”,它将被删除。因此,如果从 X 中删除“John”,则将删除“John (Group Leader)”。如果没有组长,什么都不会发生。

逻辑:

假设我在 X 中输入了“John”。失去焦点时,如果列表框为空,“John (Group Leader)”将简单地添加到列表框中。否则,如果例如我已经通过 Y 向列表框中添加了一些项目,程序将检查列表框中是否已经存在“约翰”。如果有,并且列表中没有组长,则项目“John”将替换为添加到列表顶部的“John(组长)”(这不起作用)。如果已经有组长,“John(组长)”仍然会出现在顶部,但之前的组长会被降级。因此,如果之前的 "Dick" :P 是之前的组长,则字符串 "(Group Leader)" 将从 "Dick (Group Leader)" 中删除。

现在,如果在检查整个列表后,没有与“John”匹配的项目,那么程序将像以前一样检查是否已经有组长。如果有,那么之前的组长将被简单地替换为“John(组长)”。如果没有任何组长,那么“John(组长)”将简单地添加到列表顶部(这不起作用)。

问题 1(场景)

X:约翰

列表: 约翰 瑞奇 简

OR(无论列表的顺序如何)

列表: 瑞奇 约翰 简

在 X 失去焦点时,项目“John”应该已被移除并替换为添加到列表顶部的“John (Group Leader)”,但什么都没有发生。

问题 2(场景)

X:约翰

列表: 瑞奇 简

在 X 失去焦点时,“约翰(组长)”应该被添加到列表顶部,但什么都没有发生。

因此,每当我遇到这些问题时,异常都会显示在我的即时窗口中。谁能帮我?谢谢。

【问题讨论】:

【参考方案1】:

由于您仅提供了一个小代码 sn-p,因此很难诊断所有程序的逻辑,但至于您遇到的错误,您的参与者名称是否可能少于 14 个字符?看这一行:

If ListBox_ParticipantsNames.Items.Item(0).ToString.Substring(ListBox_ParticipantsNames.Items.Item(0).ToString.Length - 14) = "(Group Leader)" Then

您可能会遇到先有鸡还是先有蛋的问题,如果您的第一个参与者的名字不以“(组长)”结尾,那么您添加它,但如果它不以“(组长)”结尾,那么您会得到一个错误。如果ListBox_ParticipantsNames.Items.Item(0).ToString.Length 小于 14,您将得到一个负数,这将产生索引超出范围异常。

查看文档:http://msdn.microsoft.com/en-us/library/hxthx5h6(v=vs.100).aspx

ArgumentOutOfRangeException: startIndex 小于零或大于此实例的长度。

这样做可能更容易:

Dim l_participantName As String = ListBox_ParticipantsNames.Items.Item(0).ToString()
l_participantName = l_participantName.PadLeft(14) ' Guarantees the length of the string is at least 14 characters
If l_participantName.Substring(l_participantName.Length - 14) = "(Group Leader)" Then

更简单:

If ListBox_ParticipantsNames.Items.Item(0).ToString.EndsWith("(Group Leader)") Then

【讨论】:

以上是关于System.ArgumentOutOfRangeException 是啥意思? (vb.net)的主要内容,如果未能解决你的问题,请参考以下文章