2017-02-03 4 views
1

ワークステーションのDNS名を読み込み、ネットワーク接続に問題があるワークステーションがあるかどうかを確認するためにpingを実行するアプリケーションを作成しました。データテーブルの情報がループ内のすべてのデータグリッドビューに移入されない

最後まで、出力ファイル情報を読み込み、DataGridView(DGV)に表示しようとしています。

問題は、読み込まれたテキストファイルから作成されたコードを表示し、別のDataGridViewを読み込もうとしているときに発生します。それは選択された単一の部屋でうまく動作します。しかし、複数のDataGridViewにデータを出力しようとすると、の最後の DataGridViewだけがそのデータで埋められます。以前のDGVのどれも入力されていません。

さらに詳しい情報として、TabPagesにはそれぞれの部屋に対応するTabPagesがあり、TabPagesにはそれぞれ別々のDataGridViewが置かれています。したがって、合計で12個のDataGridViewがあり、にデータセット情報を割り当てる必要があります。

私は単純にDGV.Rows.Add()を使ってデータを追加しようとしました[これは実際のコードではなく、単なる説明です]。 DataGridViewに1つの選択肢を使って情報を出力するのにうまくいきましたが、単に行データを追加するときにDataGridViewをクリアする方法が見つかりませんでした。 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を1つ作成し、次の部屋で常にそれを(新規作成で)再定義します。最後の部屋だけがデータを持っています。各部屋のデータの新しいコピーを作成する必要があります。 –

+0

私はそれについて考えて、oDatatableを配列にするようにしました。 Dim oDataTable(x)as DataTable しかし、これは動作しませんでしたが、実際には何もDataGridViewsに表示されませんでした。各テキストファイルでこれをループする方法はありますか? テーブル名プロパティを変数に変更するだけで十分ですか、または "As DataTable"オブジェクトの実際の新しいインスタンスが必要ですか? – Lorok

+0

データソース、データグリッド(データソースにリンクされている)、およびこの ":ルーム"に必要なその他のコントロールを含むタブページに基づいてユーザーコントロールを作成してみてください。次に、データを使用して各部屋のこれらの1つを生成し、タブコントロールTabControl.Controls.Add()に追加します。このタブは、独自のデータソースに含まれています。 1つの場所に部屋のコードしかありません。 –

答えて

0

まず、私が応答するためのMarcリヨンにありがとう言いたい:

はここに関連するコードです。しかし、私はあなたが私が見つけた答えを生み出すためにあなたの方法を取ったとは思わない。

しかし、いくつかの研究を行い、多くの試行錯誤を繰り返した結果、以下のコードが完全に動作していて、私が探していた出力が得られます。答えを得る方法はおそらくもっと短いですが、今のところこれが機能します。

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とDataSetの情報を見つけ、DataSetを使用して、異なる名前の複数のDataTableを格納しました。名前は、読み込み出力ファイル自体から提供されました。だからこそ、私は、DataSetをCollectionとして検索し、TabPagesの名前と名前を一致させ、対応するDataGridViewを持つDataSourceとしてそれぞれのテーブルデータを出力しました。

関連する問題