【问题标题】:How to transfer data from parallel arrays into a textbox?如何将数据从并行数组传输到文本框?
【发布时间】:2019-04-23 01:19:25
【问题描述】:

我正在尝试编写一个程序,将文本文件中的数据拆分为并行数组,然后将每个数组的内容写入文本框中。文本文件是这样的:

标题 1、类型 1、导演 1、
Title2, Genre2, Director2,
Title3, Genre3, Director3,

Imports System.IO
Public Class Form1

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

Dim sr As New StreamReader("MovieData.txt")
Dim movieTitles(9), genre(9), directors(9), itemsRead() As String
Dim i As Integer = 0

Do Until sr.Peek = -1

    itemsRead = sr.ReadLine.Split(",")

    movieTitles(i) = itemsRead(0)
    genre(i) = itemsRead(1)
    directors(i) = itemsRead(2)

    TextBox1.Text = movieTitles(i).PadRight(20) & genre(i).PadRight(20) & directors(i)

    i += 1

Loop

sr.Dispose()

  End Sub  
  End Class

当我点击按钮时,文本框只显示:

Title3 Genre3 Director3

我该如何解决这个问题?

【问题讨论】:

  • 当你设置TextBox1.Text = something。您删除以前的文本。请改用TextBox.AppendText(),将Environment.Newline 添加到您添加的字符串中。
  • 另外,可能使用List(Of String) 代替数组。您不需要知道文件中的行数,您可以在需要时将项目添加到列表中。另请参阅File.ReadAllLines(),这可能会有所帮助。如果您对它更满意,它会返回一个字符串数组(或者如果您愿意,它会返回一个列表)。它一次性读取文件中的所有文本行。

标签: vb.net


【解决方案1】:

如果您希望数据排列整齐,请使用 DataGridView。当您只需要从文本文件中提取数据时,不需要 StreamReader 的额外功能。

现在类和属性非常简单,您真的不需要并行数组。 我向该类添加了一个自定义构造函数,因此您可以创建一个新实例并在一行中设置所有属性。

电影列表可以用作网格的数据源。无需设置列。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim Movies As New List(Of Movie)
    Dim lines = File.ReadAllLines("MovieData.txt")
    For Each line In lines
        Dim MovieProperties = line.Split(","c)
        Dim M As New Movie(MovieProperties(0).Trim, MovieProperties(1).Trim, MovieProperties(2).Trim)
        Movies.Add(M)
    Next
    DataGridView1.DataSource = Movies
End Sub

Public Class Movie
    Public Property Title As String
    Public Property Genre As String
    Public Property Director As String
    Public Sub New(T As String, G As String, D As String)
        Title = T
        Genre = G
        Director = D
    End Sub
End Class

编辑根据 OP 评论

'**EDIT** Move the declaration of Movies to Form level
Private Movies As New List(Of Movie)

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    '**EDIT** Remove local declaration of Movies
    Dim lines = File.ReadAllLines("MovieData.txt")
    For Each line In lines
        Dim MovieProperties = line.Split(","c)
        Dim M As New Movie(MovieProperties(0).Trim, MovieProperties(1).Trim, MovieProperties(2).Trim)
        Movies.Add(M)
    Next
    DataGridView1.DataSource = Movies
    'To return the movies by Director, I strongly suggest you fill a list box with the
    'director names so spelling errors won't frustate users
    ListBox1.DataSource = GetUniqueDirectors()
End Sub

Private Function GetUniqueDirectors() As List(Of String)
    'A bit of Linq using Distinct so we don't get duplicate listing of director names.
    Dim Directors = ((From m In Movies
                      Order By m.Director
                      Select m.Director).Distinct()).ToList
    Return Directors
End Function

Private Function GetMoviesByDirector(sDirector As String) As List(Of String)
    'A little Linq magic to get the movies for selected director
    Dim DirectorsMovies = (From s In Movies
                           Where s.Director = sDirector
                           Order By s.Title
                           Select s.Title).ToList
    Return DirectorsMovies
End Function

Public Class Movie
    Public Property Title As String
    Public Property Genre As String
    Public Property Director As String
    Public Sub New(T As String, G As String, D As String)
        Title = T
        Genre = G
        Director = D
    End Sub
End Class

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    If ListBox1.SelectedIndex = -1 Then
        MessageBox.Show("Please select a Director from the list.")
        Return
    End If
    ListBox2.DataSource = Nothing
    ListBox2.Items.Clear()
    ListBox2.DataSource = GetMoviesByDirector(ListBox1.SelectedItem.ToString)
End Sub

【讨论】:

  • 非常感谢您的回答,非常感谢!如何访问电影的单个属性?例如:我希望程序将史蒂文·斯皮尔伯格导演的所有电影都写在一个文本框中(所以这些电影的属性“导演”是斯皮尔伯格)。我该怎么做?
  • 对我的答案添加了编辑。我希望这能回答你的问题。
  • 你的回答是如此完整,我希望我能给你多个正面评价:) 我必须学习很多才能理解你编写的所有代码行。我希望我能问你更多关于它的问题。我是新手,我正在自学 vb.net
  • @IvanSabatino 您可以使用答案左侧零上方的向上箭头对答案进行投票。我会尽可能回答。很难找到 vb.net 示例,因为 C# 中的示例太多。尝试学习一点 C#,以便您可以翻译成 vb 或使用在线转换器。
【解决方案2】:

大功告成,把TextBox1.Text这一行的代码替换成这样:

TextBox1.Text += movieTitles(i).PadRight(20) & genre(i).PadRight(20) & directors(i) & vbNewLine

我希望这能回答你的问题,兄弟, ^_^

【讨论】:

  • 实际上,在 vb.net 中,和号是连接字符。 &= 将是对代码的唯一更改。
猜你喜欢
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-14
  • 1970-01-01
相关资源
最近更新 更多