【发布时间】: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