0

私は Visual Basic 2010 を初めて使用し、これで頭を壁にぶつけています。

ユーザー入力を受け入れ、次の形式でテキスト ファイルに保存するフォームがあります。

"顧客番号:" 00

ドウ、ジョン

10350サムストリート

市、州の郵便番号

電話番号

"口座残高: $" 00.00

「最終支払日:」月/日/年

チェックボックスがオンになっていることに応じて、ユーザーが顧客番号または姓のいずれかを入力するテキストボックスがあります。これの目的は、姓または顧客番号で顧客レコードのテキスト ファイルを検索することです。

検索された場合、検索に使用された姓または顧客番号を持つ顧客がリストボックスに表示されます。

これが私が以下に持っているコードです:

Private Sub btnSearch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)   Handles btnSearch.Click
    'Local Variables

    Dim ReadCustomerRecords As StreamReader
    Dim strCustomerNumber As String

    ' Validate Search Criteria
    If chkCustomerNumber.Checked = False And chkLastName.Checked = False Then
        MessageBox.Show("Please select either Customer Number OR Last Name" & vbNewLine   & "to narrow your search.", "Attention")

    End If
    If chkCustomerNumber.Checked And chkLastName.Checked Then
        MessageBox.Show("You may only search by Customer Number OR Last Name." & vbNewLine & "Please revise your search.", "Attention")
    End If

    If chkCustomerNumber.Checked Then
        ReadCustomerRecords = File.OpenText(strCustomerRecordsFile)
        strCustomerNumber = ReadCustomerRecords.ReadLine()
        Do Until strCustomerRecordsFile.Contains(txtSearchFile.Text)

            If strCustomerNumber.Contains(txtSearchFile.Text) Then
                lstCustomerSearch.Items.Add(strCustomerNumber)
                lstCustomerSearch.Items.Add(ReadCustomerRecords.ReadLine())
                lstCustomerSearch.Items.Add(ReadCustomerRecords.ReadLine())
                lstCustomerSearch.Items.Add(ReadCustomerRecords.ReadLine())
                lstCustomerSearch.Items.Add(ReadCustomerRecords.ReadLine())
                lstCustomerSearch.Items.Add(ReadCustomerRecords.ReadLine())
                lstCustomerSearch.Items.Add(ReadCustomerRecords.ReadLine())
            Else
                MessageBox.Show("The customer number you entered is not valid." & vbNewLine & "Please try again or search by Last Name.", "Attention")
            End If
            Return
        Loop
        ReadCustomerRecords.Close()
    End If

    If chkLastName.Checked Then
        ReadCustomerRecords = File.OpenText(strCustomerRecordsFile)
    End If
End Sub
4

1 に答える 1

0

この条件:

Do Until strCustomerRecordsFile.Contains(txtSearchFile.Text)

ファイルの名前に検索語が含まれるまで、ループ内のコードを実行することを意味するため、ループが適切に終了しない可能性があります。ファイルの名前は変更されないため、ループが正しく終了しない可能性があります。

テキスト ファイルの検索に関しては、代わりに次のようなことができます。

If chkCustomerNumber.Checked Then
    Dim custRecords() as String = File.ReadAllLines(strCustomerRecordsFile)
    Dim isRecordFound as Boolean = false

    For i As Integer = 0 To custRecords.Length - 1
         If custRec(i).Contains(txtSearchFile.Text) Then
             isRecordFound = true;

             lstCustomerSearch.Items.Add(custRec(i))
             lstCustomerSearch.Items.Add(custRec(i + 1))
             lstCustomerSearch.Items.Add(custRec(i + 2))
             lstCustomerSearch.Items.Add(custRec(i + 3))
             lstCustomerSearch.Items.Add(custRec(i + 4))
             lstCustomerSearch.Items.Add(custRec(i + 5))
             lstCustomerSearch.Items.Add(custRec(i + 6))

             Exit For
         End If            
    Next

    If Not isRecordFound Then
         MessageBox.Show("The customer number you entered is not valid." & vbNewLine & "Please try again or search by Last Name.", "Attention")
    End If
End If

なので、少し違いますが:

  1. File.ReadAllLinesテキスト ファイルのすべての行を文字列の配列に読み込むために使用します (各配列要素は 1 行です)。あなたはまだStreamReaderあなたがやっているように使うことができますが、簡単にするために例ではFile.ReadAllLines
  2. ファイルの内容を取得したら、ループして関連する顧客 ID を見つけることができます (これに関するコメントについては以下を参照してください)。
  3. 顧客 ID が見つかったらStreamReader、配列内の次の要素を調べて、次の行を読み取ることで行っていたことを再現します (各配列要素はファイル行であることに注意してください)...実装する防御チェックここでは、多数の要素によって配列を「先読み」しようとしていますが、配列にそれほど多くの要素が残っていない場合、インデックスが範囲外であるという例外が発生します
  4. Exit Forこれ以上先に進むのは少し無意味なので、レコードが見つかった後、ループから抜けることができます

PS。ファイル形式の場合、考慮すべき代替手段は、複数行ではなく、レコード全体を 1 行で区切ります (たとえば、「|」などを使用してレコードを区切ることができます)。

PPS。Contains"02" は探している ID ではなく "1002 Fake Street" のような住所にも一致するため、検索に句を使用する場合は注意してください。ファイル形式を微調整すると、これを回避するのに役立ちます。

于 2013-03-30T23:35:29.200 に答える