2

タイプ 'System.ArgumentOutOfRangeException' の初回例外が mscorlib.dll で発生しました」という例外が発生し、プログラムに影響を与えています。これが私のコードです。以下は、コードのテキストの要約です。

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' と呼びましょう) がフォーカスを失ったときにリスト ボックスに値を追加するためのものです。

ロジックは次のとおりです (記述されたコードの順序で):

ただし、最初に、いくつかの前提条件があります。

  • リスト ボックスにアイテムを追加する方法は 2 つあります。1 つは X を使用する方法 (フォーカスを失う) で、もう 1 つは別のテキスト ボックスを使用する方法 ('Y' としましょう) です。(重要ではありません)
  • リスト ボックスに追加された X からのすべてのテキストは、リスト ボックスに既に存在するものに関係なく、リスト ボックスの最初に表示されます。
  • X からのテキスト、たとえば "John" をリスト ボックスに追加すると、" (Group Leader)" という文字列が追加されて表示されます。そのため、フォーカスを失うと、「John」は「John (Group Leader)」として表示されます。Y からの入力もあることに注意してください。ただし、Y からの入力は、含まれているテキストにすぎません。
  • (フォーカスを失ったときに) X が空の場合、リスト ボックスの最初の項目に部分文字列 "(Group Leader)" が含まれていると、その項目は削除されます。したがって、X から「ジョン」を削除すると、「ジョン (グループ リーダー)」が削除されます。そして、グループのリーダーがいなければ、何も起こりません。

論理:

X に「John」と入力したとします。フォーカスが失われ、リスト ボックスが空の場合、「John (グループ リーダー)」がリスト ボックスに追加されるだけです。それ以外の場合、たとえば、Y を介してリスト ボックスにいくつかの項目を既に追加している場合、プログラムはリスト ボックスに "John" が既に存在するかどうかを確認します。グループ リーダーが存在し、リストにまだ存在しない場合、項目「ジョン」は、リストの一番上に追加される「ジョン (グループ リーダー)」に置き換えられます (これは機能しません)。また、すでにグループ リーダーがいる場合は、「ジョン (グループ リーダー)」が一番上に表示されますが、前のグループ リーダーは降格されます。そのため、以前の "Dick" :P が以前のグループ リーダーであった場合、文字列 "(Group Leader)" は "Dick (Group Leader)" から削除されます。

ここで、リスト全体をチェックした後、"John" に一致するアイテムがない場合、プログラムは以前と同様に、グループ リーダーが既に存在するかどうかをチェックします。存在する場合、前のグループ リーダーは単純に「ジョン (グループ リーダー)」に置き換えられます。また、グループ リーダーがいない場合は、「ジョン (グループ リーダー)」がリストの一番上に追加されるだけです (これもうまくいきません)。

問題 1 (シナリオ)

X: ジョン

リスト:
ジョン・
リッキー・
ジェーン

OR (リストの順序は問わない)

リスト:
リッキー
・ジョン・
ジェーン

X がフォーカスを失うと、アイテム「ジョン」が削除され、代わりに「ジョン (グループ リーダー)」がリストの一番上に追加されるはずですが、何も起こりません。

問題 2 (シナリオ)

X: ジョン

リスト:
リッキー・
ジェーン

X がフォーカスを失うと、"John (グループ リーダー)" がリストの一番上に追加されるはずですが、何も起こりません。

そのため、これらの問題が発生するたびに、すぐにウィンドウに例外が表示されます。誰でも私を助けることができますか?ありがとうございました。

4

1 に答える 1

1

小さなコード スニペットしか提供していないため、プログラムのすべてのロジックを診断することは困難ですが、発生しているエラーに関しては、参加者名が 14 文字未満である可能性はありますか? この行を見る:

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

最初の参加者の名前が「(Group Leader)」で終わらない場合は追加しますが、「(Group Leader)」で終わらない場合はエラーが発生するという鶏と卵の問題が発生する可能性があります。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
于 2013-03-29T14:11:56.713 に答える