【问题标题】:Looping through only columns containing values for specific row in dataTable仅循环遍历包含 dataTable 中特定行的值的列
【发布时间】:2014-05-12 14:14:14
【问题描述】:

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

谢谢

【问题讨论】:

  • 列或行,您似乎想检查该行列下的单元格值...请提供更多详细信息和代码。 ..
  • 代码有助于极大地阐明问题,并且更容易提供适用的答案。
  • 是的,我想检查特定行的每一列下的单元格值@Mr CoDeXeR
  • 我添加了一个代码,希望能澄清我想要做什么@Plutonix .....这是我第一次使用 DataTables

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


【解决方案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。只需确保循环所有列并且不要提前退出。

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

【讨论】:

  • @JasonBayldon...您的回答完美。非常感谢您的帮助
  • 大声笑,甚至懒得投票。总是令人惊叹
猜你喜欢
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-05
  • 1970-01-01
  • 2018-01-29
  • 2021-04-27
  • 1970-01-01
相关资源
最近更新 更多