在DataGridView中逐行读取文本文件

时间:2015-03-05 21:06:49

标签: vb.net datagridview

我对VB.net完全陌生并且已经完成了家庭作业。我需要能够读取某些行并在DataGridView中显示它们。我已经能够将我的.txt文件链接到DGV,但是它读取整个文件而不是特定的行。我有4个按钮:btn1,btn2,btn3,btn4。我希望每个按钮显示文本文件中的相应行。在过去一周上线研究后,我仍然坚持下去。如果有人能帮助我,我会非常感激。

文本文件(" database.txt")

  

(Line1)c1 c2 c3

     

(Line2)1 1-1 1-2

     

(Line3)两个2-2 2-3

     

(Line4)三3-2 3-3

     

(Line5)四个4-2 4-3

Public Class Form1
    Private Sub btn1_Click(sender As Object, e As EventArgs) Handles btn1.Click

        Dim lines = (From line In IO.File.ReadAllLines("database.txt") _
                    Select line.Split(CChar(vbTab))).ToArray
        For x As Integer = 0 To lines(0).GetUpperBound(0)
            DataGridView1.Columns.Add(lines(0)(x), lines(0)(x))
        Next
        For x As Integer = 1 To lines.GetUpperBound(0)
            DataGridView1.Rows.Add(lines(x))
        Next
    End Sub
End Class

2 个答案:

答案 0 :(得分:0)

你没有描述你得到的结果,所以我现在无法分辨出什么是错的,因为我不在电脑上并且通常使用c ++ / cli(visual c ++)。如果我必须猜测,我会说你将每个文件行填充到一个DGV行,但你只需要1行,而不是全部。正确的吗?

无论如何,这里有一些建议:

  • 您是否必须在每次点击按钮时阅读文件?如果没有,我会读一次,存储内容并在需要时填入DGV。
  • 调试代码!在函数开头设置断点,跳过代码行,检查变量内容。
  • 将代码行dim lines拆分为3行或更多行,以使其更具可读性。也有助于调试。

答案 1 :(得分:0)

我根据您在问题中的内容做出以下假设:

  • 文件的第一行是列名
  • (Line#)仅供参考,不在实际档案中
  • 按钮名称(btn#)中的数字是应在DGV中显示的行索引

我在表单中添加了一个新按钮,用于加载文本文件中的数据,将其解析为数据表并将DataGridView1.DataSource设置为该DataTable。然后,第二种方法创建一个新的数据表,并从主数据表中导入指定的行,并在DGV中显示它。当然,很多人会说你应该使用DataView DataView.RowFilter而不是创建一个新的数据表,但这种方式是一样的。

Private txtDataTable As DataTable
Private Sub loadFileBtn_Click(sender As Object, e As EventArgs) Handles loadFileBtn.Click
    txtDataTable = New DataTable("txtContents")

    Dim txtContents As String()
    Try
        txtContents = IO.File.ReadAllLines("C:\StackOverflow\database.txt")
    Catch ex As Exception
        MsgBox(ex.Message)
        Return
    End Try

    Dim txtLines As New List(Of String())
    txtContents.ToList().ForEach(Sub(x) txtLines.Add(x.Split(CChar(vbTab))))

    If txtLines.Count > 0 Then
        txtLines.Item(0).ToList.ForEach(Sub(x) txtDataTable.Columns.Add(New DataColumn(x.ToString)))
        txtLines.RemoveAt(0)
    End If

    If txtLines.Count > 0 Then
        txtLines.ToList.ForEach(Sub(x) txtDataTable.Rows.Add(x.ToArray))
    End If
    DataGridView1.DataSource = txtDataTable
End Sub


Private Sub btn_Click(sender As Object, e As EventArgs) Handles btn1.Click, btn2.Click, btn3.Click, btn4.Click
    If txtDataTable Is Nothing Then Return

    Dim rowIndex As Integer
    If Integer.TryParse(DirectCast(sender, Button).Name.Replace("btn", String.Empty), rowIndex) Then
        rowIndex -= 1
    Else
        Return
    End If

    Dim TempTable As DataTable = txtDataTable.Clone
    If rowIndex < txtDataTable.Rows.Count Then
        TempTable.ImportRow(txtDataTable.Rows(rowIndex))
    End If

    DataGridView1.DataSource = TempTable
End Sub