VB.NET搜索客户编号的文本文件,并在列表框中显示整个客户记录

时间:2013-03-30 21:43:32

标签: vb.net

我是Visual Basic 2010的新手,并且一直用这个撞到墙上。

我有一个接受用户输入的表单,并以下列格式将其保存到文本文件中:

“客户#:”00

Doe,John

10350 Some Street

城市,州邮政编码

电话号码

“帐户余额:$”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

1 个答案:

答案 0 :(得分: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将文本文件中的所有行读入一个字符串数组(每个数组元素都是一行)。您仍然可以使用StreamReader,但为简单起见,该示例使用File.ReadAllLines
  2. 一旦我们收到您的文件内容,我们就可以循环查找相关的客户ID(请参阅下面的评论)
  3. 一旦找到了客户ID,我们就会通过查看数组中的下一个元素(注意每个数组元素是文件行),通过StreamReader复制下一行来复制你正在做的事情。你在这里实现的防御性检查将是我们试图通过一些元素在数组中“向前看”,但如果数组中没有那么多元素,你将获得关于索引的例外超出范围
  4. 我们可以在找到记录之后从循环中Exit For,因为进一步进行是没有意义的
  5. PS。对于您的文件格式,您需要考虑的另一种方法是在一行上分隔整个记录(例如,您可以使用“|”或类似的东西来分隔记录)而不是多行。

    PPS。请谨慎使用Contains条款进行搜索,因为“02”也会匹配“1002 Fake Street”等地址,而不是您要查找的ID,因此您可能会疏通误报。调整文件格式应该可以帮助您解决这个问题。