我正在使用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值,因为并非所有列都已填充
由于
答案 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。只需确保循环所有列并且不要提前退出。
如果您需要我详细说明,请告诉我。