簡體   English   中英

僅遍歷包含dataTable中特定行的值的列

[英]Looping through only columns containing values for specific row in dataTable

我正在開發使用Visual Basic 2010進行管網水力計算的應用程序。

此應用程序使用大量的迭代和循環,具體取決於用戶的輸入和網絡的大小。 大多數結果必須暫時保存才能用於下一步計算。

首先,我使用DataGridView保存結果,但是隨着迭代次數的增加,應用程序變得非常慢。

現在,我嘗試創建一個DataTable ,然后用一些初始結果填充它(這部分成功了)。 獲得的DataTable有一些未填充的列,如下所示:

22 24 10                                              
3  16 22 9 15                                             
16 12 24 13                                             
14 21 10 23 12 1                                            
24 18 23 2  1                                           

執行其他計算,並獲得確定值(X)

現在,我嘗試遍歷特定行的列,以檢查計算出的值(X)等於這些列中的值之一。

我的問題是 :如何僅遍歷具有特定行的值的列(避免包含NULL值的列)?

我是VB.net的初學者。 我希望我的問題很清楚,因為我沒有提供任何代碼。

在此先感謝您的幫助。

這是我使用的初始代碼:

           Results.DGVInitial.Rows.Clear()
           Results.DGVFinal.Rows.Clear()

                For m As Integer = 0 To NetworkLayout.DGVNetworkLayout.Rows.Count - 1
                    Results.DGVInitial.Rows.Add()
                Next


                Dim I As Integer = NetworkLayout.DGVNetworkLayout.Rows.Count - 1

                Dim Sec(I), Ini(I) As Integer            
                Dim Hyd(I), Dia(I), Len(I) As Single      
                Dim Qsec(I), Qini(I), Vsec(I) As Single   
                Dim U(I), Y(I) As Single                 

                Do

                    I = I - 1

                    Sec(I) = NetworkLayout.DGVNetworkLayout.Rows(I).Cells(0).Value
                    Ini(I) = NetworkLayout.DGVNetworkLayout.Rows(I).Cells(1).Value
                    Hyd(I) = NetworkLayout.DGVNetworkLayout.Rows(I).Cells(6).Value
                    Dia(I) = NetworkLayout.DGVNetworkLayout.Rows(I).Cells(4).Value
                    Len(I) = NetworkLayout.DGVNetworkLayout.Rows(I).Cells(3).Value

                    Dim V As Integer
                    V = Results.DGVRandomGen.Rows(TotalNum_Runs - 1).Cells(I).Value    
                    Qsec(I) = 0
                    Dim q As Single = 0

                    For n As Integer = 0 To Results.DGVInitial.Rows.Count - 1    
                        If Results.DGVInitial.Rows(n).Cells(1).Value = Sec(I) Then
                            q = Results.DGVInitial.Rows(n).Cells(0).Value
                            Qsec(I) = Qsec(I) + q
                        Else
                            Qsec(I) = Qsec(I)

                        End If
                    Next

                    If V = 1 Then ' if the hydrant is open
                       Qini(I) = Hyd(I) + Qsec(I)
                    Else ' if the hydrant is close
                       Qini(I) = Qsec(I)
                    End If


                    Results.DGVInitial.Rows(I).Cells(0).Value = Qini(I)
                    Results.DGVInitial.Rows(I).Cells(1).Value = Ini(I)

Results.DGVSectionDischarges.Rows(TotalNum_Runs-1).Cells(I).Value = ini(I).ToString(“ F2”)

現在,而不是使用

V = Results.DGVRandomGen.Rows(TotalNum_Runs-1).Cells(I).Value

我想用名為“ DT_Random”的數據表替換“ DGVRandomGen”

就像我說的我是一個初學者,所以我不確定如何編寫代碼,但是它將是這樣的:

對於DT_Random.Rows(TotalNum_Runs-1)

               For Each col As DataColumn In DT_Random.Columns
                    If DT_Random.Rows(TotalNum_Runs - 1).Item(col) = I Then
                        Qini(I) = Hyd(I) + Qsec(I)
                    Else 
                        Qini(I) = Qsec(I)
                    End If
                Next

但我想避免使用Null值,因為並非所有列都已填充

謝謝

也許這會幫助您:

    Dim myXvalue = 24

    Dim myDataTable As New DataTable

    myDataTable.Columns.Add("Col1")
    myDataTable.Columns.Add("Col2")
    myDataTable.Columns.Add("Col3")
    myDataTable.Columns.Add("Col4")


    myDataTable.Rows.Add(22, 24, 10, DBNull.Value)
    myDataTable.Rows.Add(3, 16, 22, DBNull.Value)
    myDataTable.Rows.Add(24, 18, DBNull.Value, 24)

    For Each column As DataColumn In myDataTable.Columns

        If IsDBNull(myDataTable.Rows(0).Item(column)) Then
            MsgBox("DB Null Found At: " & column.ColumnName)
            Continue For
        End If

        If myDataTable.Rows(0).Item(column) = myXvalue Then
            MsgBox("Match: " & myDataTable.Rows(0).Item(column) & " found at " & column.ColumnName)
        End If

    Next column

只是一個簡單的示例,您可能需要對其進行一些重組,但至少它顯示了如何按列訪問數據表中的值。 我會做一個傳遞行索引作為參數並返回布爾值的函數。 在子內部創建兩個布爾,一個用於行中存在的dbnull,另一個用於查找匹配值。 如果dbnull bool為false,並且match值為true,則返回true。 只要確保您循環所有列並且不要提早退出即可。

如果您需要我詳細說明,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM