在Visual Basic中的标签框中显示文本文件中的字符串

时间:2016-10-09 21:46:09

标签: vb.net

所以我试图创建一个代码,用户输入一个ID号并接收ID对应的文本行。我无法使用代码,因为我无法在标签框中显示结果(或正确的结果)。

例如:

如果输入ID 1,则显示与ID 2对应的数据,ID 2对应ID 3,ID 3结束循环(当前数据中只有3条记录)。

我已将我的代码包含在

之下
Private Sub btnSearch_Click(sender As Object, e As EventArgs) Handles btnSearch.Click
    Filename = "NamesAndAges.txt"
    FileOpen(1, Filename, OpenMode.Input,,,)

    Dim ID As Integer
    ID = txtSearch.Text

    Dim Found As Boolean
    Found = False

    Do While Not EOF(1) And Found = False

        If LineInput(1).Contains(ID) Then
            lblDisplaySearch.Text = LineInput(1)
            Found = True
        Else MsgBox("Not Found")

        End If
    Loop

    FileClose(1)
End Sub

提前感谢,如果有人能解释他们使用的代码,我也会非常感激,因为我仍然是一个视觉基础初学者。

2 个答案:

答案 0 :(得分:0)

每次拨打LineInput(1)时,它都会读取一行,因此您正在读取一行并检查其是否包含ID,然后读取另一行并将lblDisplaySearch.Text设置为该值。

尝试这样的事情:

Dim line As String

Do While Not EOF(1) And Found = False
    line = LineInput(1)

    If line.Contains(ID) Then
        lblDisplaySearch.Text = line
        Found = True
    Else MsgBox("Not Found")

    End If
Loop

答案 1 :(得分:0)

我强烈建议您使用File.ReadLines

来简化此代码
Private Sub btnSearch_Click(sender As Object, e As EventArgs) Handles btnSearch.Click
    Filename = "NamesAndAges.txt"
    Dim line = File.ReadLines(Filename).FirstOrDefault(Function(x) x.Contains(txtSearch.Text))
    If line Is Nothing Then
        MsgBox("Not Found")
        Exit Sub
    End If
    lblDisplaySearch.Text = line
End Sub

主要优点是您无需管理Do While循环。相反,您将匹配条件(Function(x) x.Contains(txtSearch.Text))传递给FirstOrDefault方法,该方法在内部将找到与条件匹配的第一行并将其返回,或者如果找不到则返回Nothing

For EachIEnumerable

VB.NET允许您在不知道或关心集合中的索引的情况下循环遍历一组项目。例如:

For Each x As String In File.ReadLines(Filename)
    'do something with the line, which is now in x
Next

为了将For Each与对象一起使用,该对象必须implement一个特定的interface - IEnumerable接口。

Interfaces

接口保证给定对象具有或实现特定成员。在这种情况下,如果一个对象实现了IEnumerable接口,那意味着它有一个GetEnumerator方法,For Each使用它。

IEnumerable(Of T)

File.ReadLines返回的对象实现了另一个名为IEnumerable(Of T)的更高级generic接口。使用此接口,编译器可以自动确定For Each的每一步都将解析一个字符串,我们不需要将其指定为字符串:

For Each x In File.ReadLines(Filename)
    'x is known to be a String here
Next

Lambda expressions

条件“包含搜索文本的行”被写为 lambda表达式,它(在这种情况下)被制作成没有明确名称或定义的方法。这很方便,因为我们不必写这个:

Function ContainsCondition(line As String, toFind As String) As Boolean
    Return line.Contains(toFind)
End Function`

每当我们想以这种方式表达条件时。

条件<{strong>

x的类型

因为File.ReadLines返回IEnumerable(Of T),在这种情况下是IEnumerable(Of String),编译器可以发现条件正在处理字符串,所以我们不必指定{ {1}}是条件中的字符串。