2017-02-03 4 views
1

Я создал приложение, которое считывает имена DNS рабочих станций и пингорует их, чтобы увидеть, есть ли какие-либо рабочие станции, которые имеют проблемы с сетевым подключением.Информация таблицы данных, не заполняющая все данные Grid View in Loop

Все отлично до конца, где я пытаюсь прочитать информацию о выходных файлах и отображать ее в DataGridView (DGV).

Проблема возникает, когда я пытаюсь отобразить созданный код, который можно использовать в текстовом файле, и заполнять разные DataGridView. Он отлично работает с выбранной комнатой. Но когда я пытаюсь вывести данные в несколько DataGridViews, только последние DataGridView заполняется его данными. Ни один из предыдущих DGV не заселен.

Немного больше информации, у меня есть TabControl с вкладками, которые соответствуют каждой комнате, в тех вкладках, где находится каждый отдельный DataGridView. Таким образом, в общей сложности есть 12 DataGridViews, которые могут нуждаться в информации о данных, назначаемой ее DataSource.

Я пробовал просто добавлять данные через DGV.Rows.Add() [это не фактический код, просто объяснение]. Теперь, когда это отлично работало для вывода информации в DataGridView с помощью одного выбора, я не смог найти способ очистить DataGridView, когда я просто добавлял в него данные Row. DGV<Name>.Rows.Clear() ничего не сделал, DGV<Name>.Rows.Remove(#) ошибся, DGV<Name>.DataSource = VbNull ничего не сделал, и я предполагаю, что это связано с тем, что на самом деле я фактически не добавлял источник данных в DGV.

Любая помощь относительно того, что мне нужно сделать, чтобы убедиться, что DGV каждой комнаты имеет правильную выходную информацию в соответствующем DGV.

Я использую VS 2015 Community Edition, если это имеет значение. И у меня нет доступа к плагину 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 
+0

Вы создаете один источник данных oDataTable и постоянно переопределяете (по новому) его для следующей комнаты. Так что только в последней комнате есть данные. Вы должны создать новую копию данных для каждой комнаты. –

+0

Я подумал об этом и попытался сделать oDatatable в массив, поэтому что-то вроде: Dim oDataTable (x) как DataTable Но это не показало, что оно работает, и фактически не привело к тому, что ничего не отображалось ни в одном из DataGridView. Есть ли способ сделать это через каждый текстовый файл? Устанавливает ли свойство имен таблиц для переменной (которая изменяется) достаточно или мне нужен фактический новый экземпляр объекта «Как DataTable»? – Lorok

+0

Попробуйте создать пользовательский элемент управления на основе закладки, содержащей источник данных, datagrid (связанный с источником данных) и любые другие элементы управления, необходимые для этой «комнаты». Затем используйте свои данные для создания одного из них для каждой комнаты и добавьте его в элемент управления TabControl.Controls.Add(). Вкладка будет автономной с собственным источником данных. И у вас есть только код для комнаты, в одном месте. –

ответ

0

Во-первых, я хотел бы сказать спасибо Марку Лион за ответ. Тем не менее, я не думаю, что я взял ваш путь для создания ответа, который я нашел.

Но после проведения некоторых исследований, а затем много проб и ошибок, следующий код - это то, что я придумал, полностью работает и дает мне результат, который я искал. Вероятно, есть более короткий путь к достижению ответа, но пока это работает.

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 

Я прошел и повторно сделал много кода. Я взял основные идеи того, что я пытался сделать, а затем уточнил их (не только в этих блоках кода). Это помогло совсем немного, так как оно передало данные лучше, чем мои исходные сегменты кода.

В любом случае, отвечая на главный ответ, я нашел информацию о DataSet с DataTables и использовал DataSet для хранения нескольких таблиц данных с разными именами. Имена были предоставлены самими выходными файлами. Таким образом, все, что мне нужно было сделать после этого, - это поиск в DataSet как коллекции и сопоставление имен с именами TabPages, а затем вывод данных соответствующих таблиц в качестве источника данных с соответствующим DataGridView.

Смежные вопросы