我是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
答案 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
所以它有点不同但是:
File.ReadAllLines
将文本文件中的所有行读入一个字符串数组(每个数组元素都是一行)。您仍然可以使用StreamReader
,但为简单起见,该示例使用File.ReadAllLines
StreamReader
复制下一行来复制你正在做的事情。你在这里实现的防御性检查将是我们试图通过一些元素在数组中“向前看”,但如果数组中没有那么多元素,你将获得关于索引的例外超出范围Exit For
,因为进一步进行是没有意义的PS。对于您的文件格式,您需要考虑的另一种方法是在一行上分隔整个记录(例如,您可以使用“|”或类似的东西来分隔记录)而不是多行。
PPS。请谨慎使用Contains
条款进行搜索,因为“02”也会匹配“1002 Fake Street”等地址,而不是您要查找的ID,因此您可能会疏通误报。调整文件格式应该可以帮助您解决这个问题。