如何将文本文件读取到 Datagridview
How To Read Text File to Datagridview
我有一个项目,我想将文本文件加载到 DataGridview
。
数据:
"#Tools Must You Have
Tool_1 Screwdriver T1
Tool_2 Screw T2
Tool_3 Ruler T3"
我有两个按钮(btSave
& btOpen
)和一个 DataGridview
有两列(Tools
& Name
)
我想将数据读取到 DataGridview
,但我想跳过以“#
”开头的行
我用这段代码试过了
Private Sub LoadGridData(ByRef ThisGrid As DataGridView, ByVal Filename As String)
ThisGrid.Rows.Clear()
Dim TextLine As String = ""
Dim SplitLine() As String
Using objReader As New System.IO.StreamReader(Filename)
Do While objReader.Peek() <> -1
TextLine = objReader.ReadLine()
SplitLine = Split(TextLine, " ")
Me.DataGridView1.Rows.Add(SplitLine)
Loop
End Using
End Sub
此代码错误,加载时,列中的文本不相同,只读了一个单词“Screwdriver
”而不是“screwdriver T1
”,
有什么解决办法吗?
当您 运行 该拆分函数时,您将在每个 space 上拆分整个字符串,因此您最终得到 3 长数组,而 T1 位于第三个字符串中。我假设您的 table 仅由两列定义。试试这个:
Do While objReader.Peek() <> -1
TextLine = objReader.ReadLine()
If Textline.Trim.Length > 0 AndAlso not TextLine.StartsWith("#") Then
DataGridView1.Rows.Add(TextLine.Split(" ")(0), textLine.Replace(TextLine.Split(" ")(0), "").Substring(1))
End If
Loop
实际上,我正在对您的作业和数据做出各种假设,但这应该会让您朝着正确的方向前进。
Private Sub LoadGridData(ByVal ThisGrid As DataGridView, ByVal Filename As String)
ThisGrid.Rows.Clear()
ThisGrid.Rows.AddRange(
File.ReadLines(FileName).
Where(Function(line) Not line.TrimStart().StartsWith("#")).
Select(Function(line) line.Split(" ".ToCharArray(), 2)).
ToArray()
)
End Sub
注意(除其他外)从 ByRef
到 ByVal
的变化。很容易错过那个,ByRef
vs ByVal
可能并不意味着你认为的那样。请记住 VB.Net 中的 ByVal
仍然传递引用 。不同之处在于,它对参考值进行了 copy,但由于该副本仍引用同一个 DataGridView 对象,因此它将执行您希望它执行的操作。唯一应该使用 ByRef
的情况是需要直接对变量进行赋值,并且希望该赋值显示在调用代码中。这与分配给对象的 属性 不同。如果你想实际替换整个对象,你只需要这个,而且几乎永远不会。
我有一个项目,我想将文本文件加载到 DataGridview
。
数据:
"#Tools Must You Have
Tool_1 Screwdriver T1
Tool_2 Screw T2
Tool_3 Ruler T3"
我有两个按钮(btSave
& btOpen
)和一个 DataGridview
有两列(Tools
& Name
)
我想将数据读取到 DataGridview
,但我想跳过以“#
”开头的行
我用这段代码试过了
Private Sub LoadGridData(ByRef ThisGrid As DataGridView, ByVal Filename As String)
ThisGrid.Rows.Clear()
Dim TextLine As String = ""
Dim SplitLine() As String
Using objReader As New System.IO.StreamReader(Filename)
Do While objReader.Peek() <> -1
TextLine = objReader.ReadLine()
SplitLine = Split(TextLine, " ")
Me.DataGridView1.Rows.Add(SplitLine)
Loop
End Using
End Sub
此代码错误,加载时,列中的文本不相同,只读了一个单词“Screwdriver
”而不是“screwdriver T1
”,
有什么解决办法吗?
当您 运行 该拆分函数时,您将在每个 space 上拆分整个字符串,因此您最终得到 3 长数组,而 T1 位于第三个字符串中。我假设您的 table 仅由两列定义。试试这个:
Do While objReader.Peek() <> -1
TextLine = objReader.ReadLine()
If Textline.Trim.Length > 0 AndAlso not TextLine.StartsWith("#") Then
DataGridView1.Rows.Add(TextLine.Split(" ")(0), textLine.Replace(TextLine.Split(" ")(0), "").Substring(1))
End If
Loop
实际上,我正在对您的作业和数据做出各种假设,但这应该会让您朝着正确的方向前进。
Private Sub LoadGridData(ByVal ThisGrid As DataGridView, ByVal Filename As String)
ThisGrid.Rows.Clear()
ThisGrid.Rows.AddRange(
File.ReadLines(FileName).
Where(Function(line) Not line.TrimStart().StartsWith("#")).
Select(Function(line) line.Split(" ".ToCharArray(), 2)).
ToArray()
)
End Sub
注意(除其他外)从 ByRef
到 ByVal
的变化。很容易错过那个,ByRef
vs ByVal
可能并不意味着你认为的那样。请记住 VB.Net 中的 ByVal
仍然传递引用 。不同之处在于,它对参考值进行了 copy,但由于该副本仍引用同一个 DataGridView 对象,因此它将执行您希望它执行的操作。唯一应该使用 ByRef
的情况是需要直接对变量进行赋值,并且希望该赋值显示在调用代码中。这与分配给对象的 属性 不同。如果你想实际替换整个对象,你只需要这个,而且几乎永远不会。