【问题标题】:VB.NET Search Text File for Customer Number and display entire customer record in listboxVB.NET 搜索客户编号的文本文件并在列表框中显示整个客户记录
【发布时间】:2014-03-28 10:27:08
【问题描述】:

我是 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

【问题讨论】:

  • 我本来想补充一点,当我运行应用程序时,选中客户编号复选框,然后搜索“01”,它会显示客户 01 的记录
  • 但是当我尝试 02 等等时它就会锁定。我知道我错了,所以有人可以指出我正确的方向。

标签: vb.net


【解决方案1】:

这里的条件:

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 读取下一行的操作,并查看数组中的下一个元素(注意每个数组元素都是一个文件行)...A您在此处实施的防御性检查将是我们试图通过许多元素在数组中“向前看”,但是如果数组中没有那么多元素,您将收到关于索引出现的异常范围
  4. 我们可以在找到记录后从循环中Exit For,因为继续进行下去有点毫无意义

PS。对于您的文件格式,您可以考虑将整条记录放在一行并分隔(例如,您可以使用“|”或类似的东西来分隔记录)而不是多行。

PPS. 使用 Contains 子句进行搜索时要小心,因为“02”还会匹配“1002 Fake Street”之类的地址,而不是您要查找的 ID,因此您可能会疏通误报。调整文件格式应该可以帮助您解决这个问题。

【讨论】:

  • 你是一个救生员。我的意思是字面意思。我已经在这部分工作了将近两天,我的挫败感达到了顶峰。我更改了代码以更好地适合我的程序,但我所做的一件事是将 .contain(txtSearchfile.Text) 更改为 .Contain(""& txtSearchFile.txt)
猜你喜欢
  • 1970-01-01
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多