Domanda

I am developing an application using Visual Basic 2010 for hydraulic calculations of a pipe network.

This application uses a lot of iterations and loops, depending on the user input and size of network. Most of the results have to be saved temporarily to be used for the next step of calculations.

Firstly, I used a DataGridView to save the results but as the number of iterations increased, the application became very slow.

Now I am trying to create a DataTable, then populate it with some initial results (this part was successful). The obtained DataTable has some columns that are not populated like so:

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

Other calculations are performed and a certain value (X) is obtained.

Now I am trying to loop through the columns of a specific row to check if the calculated value (X) equals to one of the values in those columns.

My question is: How can I loop through only the columns that have values (avoiding the columns containing NULL values) for a specific row?

I am a beginner in VB.net. I hope my question is clear as I didn't provide any code.

Thanks in advance for you help.

This is the initial code I used:

           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")

Now instead of using

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

I would like to replace the "DGVRandomGen" with a DataTable called "DT_Random"

Like I said I am a beginner so I am not sure how to code it but it will be something like this:

For 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

But I want to avoid Null values as not all columns are populated

Thanks

È stato utile?

Soluzione

Maybe this will help you:

    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

Just a quick example, you may need to restructure it a bit, but at least it shows you how to access the values in your datatable by columns. I would do a function that passes a row index as a parameter and returns a boolean. Create two booleans inside the sub, one for dbnull existing in the row, and one for finding a matching value. If dbnull bool is false, and match value is true, then return true. Just make sure you loop all the columns and dont exit early.

If you need me to elaborate let me know.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top