仅循环包含dataTable中特定行的值的列

时间:2014-05-12 14:14:14

标签: vb.net datatable vb.net-2010 datarow datacolumn

我正在使用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”的DataTable替换“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值,因为并非所有列都已填充

由于

1 个答案:

答案 0 :(得分:1)

也许这会对你有所帮助:

    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

只是一个简单的示例,您可能需要对其进行一些重组,但至少它会向您展示如何按列访问数据表中的值。我会做一个函数,它将行索引作为参数传递并返回一个布尔值。在sub中创建两个布尔值,一个用于行中存在的dbnull,另一个用于查找匹配值。如果dbnull bool为false,且匹配值为true,则返回true。只需确保循环所有列并且不要提前退出。

如果您需要我详细说明,请告诉我。