【问题标题】:Data Table Information not Populating to all Data Grid View's in Loop数据表信息未填充到循环中的所有数据网格视图
【发布时间】:2017-02-03 15:06:59
【问题描述】:

我创建了一个应用程序,它读取工作站 DNS 名称并 ping 它们以查看是否有任何工作站存在网络连接问题。

一切都很好,直到最后,我正在尝试读取输出文件信息并将其显示在 DataGridView (DGV) 中。

当我尝试显示从读取的文本文件创建的数据表代码并填充不同的 DataGridView 时,会出现此问题。它适用于选择一个单人房间。但是当我尝试将数据输出到多个 DataGridViews 时,只有 last DataGridView 填充了它的数据。以前的 DGV 都没有填充。

更多信息,我有一个 TabControl,其 TabPages 对应于每个房间,在这些 TabPages 中是每个单独的 DataGridView 所在的位置。所以总共有 12 个 DataGridView,可能需要将数据表信息分配给它的 DataSource。

我尝试通过 DGV.Rows.Add() 简单地添加数据 [这不是实际代码,只是一个解释]。现在,虽然这对于通过单个选择将信息输出到 DataGridView 效果很好,但当我只是向其中添加行数据时,我找不到清除 DataGridView 的方法。 DGV<Name>.Rows.Clear() 没有做任何事情,DGV<Name>.Rows.Remove(#) 出错了,DGV<Name>.DataSource = VbNull 也没有做任何事情,我假设那是因为我实际上并没有首先将数据源添加到 DGV。

任何关于我需要做什么以确保每个房间的 DGV 在其适当的 DGV 中正确输出信息的任何帮助将不胜感激。

如果这有什么不同的话,我正在使用 VS 2015 社区版。而且我无权访问 LINQ 插件,以防万一人们认为这可能是解决问题的一种方法。

以下是相关代码:

    Private Sub loadResults()

    Dim i As Integer = 0        'Counter variable
    Dim fName As String() = GlobalVariables.selectedRoomsList.ToArray
    Dim x As Integer = fName.Length         'Upper limit of the Array to be checked against
    Dim AppDir As String = Path.GetDirectoryName(Path.GetDirectoryName(Application.StartupPath))
    Dim dataName As String = "dgv" & fName(i)
    Dim resultFilePath As String = AppDir & "\data\output\" & fName(i) & ".txt"
    Dim fileExists As Boolean = File.Exists(resultFilePath)
    Dim rowvalue As String
    Dim cellvalue(5) As String
    Dim oDataTable As DataTable

    lblGoodPingTotal.Text = GlobalVariables.successfulPings
    lblBadPingTotal.Text = GlobalVariables.failedPings
    lblTimeElapsed.Text = GlobalVariables.elapsedTime

    Do Until i > x

        oDataTable = New DataTable("PingTable")

        Dim Column1 As DataColumn = New DataColumn("Computer Name")
        Column1.DataType = System.Type.GetType("System.String")
        Dim Column2 As DataColumn = New DataColumn("Status")
        Column2.DataType = System.Type.GetType("System.String")
        Dim Column3 As DataColumn = New DataColumn("IP Address")
        Column3.DataType = System.Type.GetType("System.String")
        Dim Column4 As DataColumn = New DataColumn("Bytes Sent")
        Column4.DataType = System.Type.GetType("System.String")
        Dim Column5 As DataColumn = New DataColumn("Round Trip")
        Column5.DataType = System.Type.GetType("System.String")
        Dim Column6 As DataColumn = New DataColumn("TTL")
        Column6.DataType = System.Type.GetType("System.String")

        oDataTable.Columns.Add(Column1)
        oDataTable.Columns.Add(Column2)
        oDataTable.Columns.Add(Column3)
        oDataTable.Columns.Add(Column4)
        oDataTable.Columns.Add(Column5)
        oDataTable.Columns.Add(Column6)

        If fileExists Then

            Using sReader As New StreamReader(resultFilePath)

                While sReader.EndOfStream = False

                    Dim rowAdd As DataRow
                    rowAdd = oDataTable.NewRow()

                    rowvalue = sReader.ReadLine()
                    cellvalue = rowvalue.Split(","c)

                    rowAdd.ItemArray = cellvalue

                    oDataTable.Rows.Add(rowAdd)

                End While

                sReader.Close()

            End Using

            dataPrint(dataName, oDataTable)

            i = i + 1

        Else
            MsgBox("Error! The file for Room" & fName(i) & "is not found.", vbOKOnly = MsgBoxStyle.Critical, "Error")

            Exit Do

        End If

    Loop

End Sub

Private Sub dataPrint(iName As String, iTableData As DataTable)

    Dim dgvName As String = iName
    Dim oDataTable As DataTable = iTableData

    If dgvName = "dgvA1402" Then

        dgvA1402.DataSource = oDataTable

    ElseIf dgvName = "dgvA1532" Then

        dgvA1532.DataSource = oDataTable

    ElseIf dgvName = "dgvA1D038" Then

        dgvA1D038.DataSource = oDataTable

    ElseIf dgvName = "dgvA1D042" Then

        dgvA1D042.DataSource = oDataTable

    ElseIf dgvName = "dgvA1D043B" Then

        dgvA1D043B.DataSource = oDataTable

    ElseIf dgvName = "dgvA1E014A" Then

        dgvA1E014A.DataSource = oDataTable

    ElseIf dgvName = "dgvA1E036" Then

        dgvA1E036.DataSource = oDataTable

    ElseIf dgvName = "dgvA1E047C" Then

        dgvA1E047C.DataSource = oDataTable

    ElseIf dgvName = "dgvA1E047D" Then

        dgvA1E047D.DataSource = oDataTable

    ElseIf dgvName = "dgvA1E047F" Then

        dgvA1E047F.DataSource = oDataTable

    ElseIf dgvName = "dgvA1E047G" Then

        dgvA1E047G.DataSource = oDataTable

    ElseIf dgvName = "dgvA1E048" Then

        dgvA1E048.DataSource = oDataTable

    End If


End Sub

【问题讨论】:

  • 您创建一个数据源 oDataTable,并不断为下一个房间重新定义(通过 New)它。所以只有最后一个房间有数据。您应该为每个房间创建一个新的数据副本。
  • 我想到了这一点,并尝试将 oDatatable 制作成一个数组,如下所示: Dim oDataTable(x) as DataTable 但这并没有奏效,实际上没有显示任何内容数据网格视图。有没有办法用每个文本文件循环遍历这个?将 Tables name 属性设置为一个变量(会发生变化)就足够了,还是我需要一个“As DataTable”对象的实际新实例?
  • 尝试创建一个基于标签页的用户控件,该标签页包含一个数据源、一个数据网格(链接到数据源)和任何其他您需要的“:room”控件。然后使用您的数据为每个房间生成其中一个并将其添加到选项卡控件 TabControl.Controls.Add()。该选项卡将包含自己的数据源。而且您只有一个房间的代码。

标签: .net vb.net winforms datagridview datatables


【解决方案1】:

首先,我要感谢 Marc Lyon 的回复。但是,我认为我没有按照您的方式得出我找到的答案。

但是在做了一些研究和大量试验和错误之后,以下代码是我想出的,它完全有效,并给了我我正在寻找的输出。可能有一种更短的方法可以得到答案,但目前可行。

Private Sub loadResults(aRooms As List(Of String), pingUp As Integer, pingDown As Integer)
    '//All passed variables
    Dim rmNames As List(Of String) = aRooms
    '//All file path and directory variables
    Dim AppDir As String = Path.GetDirectoryName(Path.GetDirectoryName(Application.StartupPath))
    Dim resultFilePath As String
    Dim fileExists As Boolean
    '//All row and row data variables
    Dim rowvalue As String
    Dim cellvalue(5) As String
    '//All datatable and dataset variables
    Dim dSet As DataSet
    Dim oDataTable As DataTable

    '//Displays the total number of ping Successes and Fails
    lblGoodPingTotal.Text = pingUp
    lblBadPingTotal.Text = pingDown
    lblTimeElapsed.Text = GlobalVariables.elapsedTime

    '//Sets the new dataset
    dSet = New DataSet()

    For Each fileName As String In rmNames

        oDataTable = New DataTable(fileName)
        '//Creating the columns and column names in code
        Dim Column1 As DataColumn = New DataColumn("Computer Name")
        Column1.DataType = System.Type.GetType("System.String")
        Dim Column2 As DataColumn = New DataColumn("Status")
        Column2.DataType = System.Type.GetType("System.String")
        Dim Column3 As DataColumn = New DataColumn("IP Address")
        Column3.DataType = System.Type.GetType("System.String")
        Dim Column4 As DataColumn = New DataColumn("Bytes Sent")
        Column4.DataType = System.Type.GetType("System.String")
        Dim Column5 As DataColumn = New DataColumn("Round Trip")
        Column5.DataType = System.Type.GetType("System.String")
        Dim Column6 As DataColumn = New DataColumn("TTL")
        Column6.DataType = System.Type.GetType("System.String")

        '//Setting the columns for the generated datatable
        oDataTable.Columns.Add(Column1)
        oDataTable.Columns.Add(Column2)
        oDataTable.Columns.Add(Column3)
        oDataTable.Columns.Add(Column4)
        oDataTable.Columns.Add(Column5)
        oDataTable.Columns.Add(Column6)

        '//Setting the output file path
        resultFilePath = AppDir & "\data\output\" & fileName & ".txt"

        '//Setting the path to test for file existence
        fileExists = File.Exists(resultFilePath)

        If fileExists Then
            '//If the file exists the file is read into memory and the datatable has it's values assigned to a row
            Using sReader As New StreamReader(resultFilePath)

                While sReader.EndOfStream = False

                    '//New row created
                    Dim rowAdd As DataRow
                    rowAdd = oDataTable.NewRow()

                    '//New row has the data read and assigned to it
                    rowvalue = sReader.ReadLine()
                    cellvalue = rowvalue.Split(","c)

                    rowAdd.ItemArray = cellvalue

                    '//Datatabl gets the row of data assigned to it, one at a time
                    oDataTable.Rows.Add(rowAdd)

                End While

                sReader.Close()

            End Using

            '//Commits the changes to each datatable that's created
            oDataTable.AcceptChanges()

            '//Adds each datatable that's created to the Dataset for use in output
            dSet.Tables.Add(oDataTable)

        Else

            '//Error message just incase a output file wasn't generated for the selected room
            MsgBox("Error! The file for Room " & fileName & " is not found.", vbOKOnly = MsgBoxStyle.Critical, "Error")

        End If

    Next

    '//Calling the sub-routine to output the date to the proper datagridview
    dataPrint(dSet)

End Sub

Private Sub dataPrint(iDataSet As DataSet)
    '//Variables cast for getting the Dataset and DataTable collections
    Dim datSet As DataSet = iDataSet
    Dim datTCollection As DataTableCollection = datSet.Tables
    '//Running the checks against the selected Dataset for Datatable names and information output
    For Each tbName As DataTable In datTCollection

        If tbName.TableName = "A1402" Then
            dgvA1402.DataSource = tbName
        ElseIf tbName.TableName = "A1532" Then
            dgvA1532.DataSource = tbName
        ElseIf tbName.TableName = "A1D038" Then
            dgvA1D038.DataSource = tbName
        ElseIf tbName.TableName = "A1D042" Then
            dgvA1D042.DataSource = tbName
        ElseIf tbName.TableName = "A1D043B" Then
            dgvA1D043B.DataSource = tbName
        ElseIf tbName.TableName = "A1E014A" Then
            dgvA1E014A.DataSource = tbName
        ElseIf tbName.TableName = "A1E036" Then
            dgvA1E036.DataSource = tbName
        ElseIf tbName.TableName = "A1E047C" Then
            dgvA1E047C.DataSource = tbName
        ElseIf tbName.TableName = "A1E047D" Then
            dgvA1E047D.DataSource = tbName
        ElseIf tbName.TableName = "A1E047F" Then
            dgvA1E047F.DataSource = tbName
        ElseIf tbName.TableName = "A1E047G" Then
            dgvA1E047G.DataSource = tbName
        ElseIf tbName.TableName = "A1E048" Then
            dgvA1E048.DataSource = tbName
        End If

    Next

End Sub

我经历并重新编写了很多代码。我采用了我正在尝试做的事情的核心思想,然后对其进行了改进(也不只是在这些代码块中)。这很有帮助,因为它比我的原始代码段更好地传输数据。

无论如何,关于主要答案,我找到了有关带有 DataTables 的 DataSets 的信息,并使用 DataSet 来存储多个具有不同名称的 DataTables。这些名称是从读入的输出文件本身提供的。所以在那之后我需要做的就是搜索作为一个集合的 DataSet 并将名称与 TabPages 的名称匹配,然后将相应的表数据作为 DataSource 和相应的 DataGridView 输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    相关资源
    最近更新 更多