2016-07-13 4 views
1

Ich habe ein DataGridView, das 1000 Datenpunkte enthält. Ich habe Min, Max und Durchschnitt der Werte in meinem DataGridView erfolgreich berechnet, aber jetzt möchte ich die Min-, Max- und Durchschnittswerte nur aus einem bestimmten Bereich erhalten. Zum Beispiel Daten in 101 bis 200 oder 201 bis 300.Datagridview, wie man Min-, Max- und Durchschnittswerte in bestimmten Bereichen erhält

For i As Integer = 0 To dataGridView1.Rows.Count() - 1 Step +1 

    sum_tmp = sum_tmp + dataGridView1.Rows(i).Cells(2).Value 

    If i = 0 Then 
     max_tmp = dataGridView1.Rows(i).Cells(2).Value 
     min_tmp = dataGridView1.Rows(i).Cells(2).Value 
    End If 

    If max_tmp < dataGridView1.Rows(i).Cells(2).Value Then 
     max_tmp = dataGridView1.Rows(i).Cells(2).Value 
    End If 

    If min_tmp > dataGridView1.Rows(i).Cells(2).Value Then 
     min_tmp = dataGridView1.Rows(i).Cells(2).Value 
    End If 

Next 

avg_tmp = sum_tmp/dataGridView1.Rows.Count() 

Oben ist mein Code, um den Wert zu erhalten. Ich habe versucht, Integer-Variable, die durch Auswahl von Combobox geändert, aber immer immer 0 Wert auf min bekommen. Leider zeigt es im Durchschnitt den richtigen Wert. Wie ist es möglicherweise falsch?

+0

können Sie die 'Filterfunktion' verwenden und die' Between Methode' verwenden, um die Werte mit 'DataView' zu erhalten? Google-Suche nach DataTable.FIlter() Methode " – MethodMan

+0

Wann möchten Sie die Summe oder den Durchschnitt berechnen? Wählt der Benutzer einige Zeilen und klickt auf einen Kontextmenüeintrag? –

+0

@AlexB. Sie stellen eine gute Frage. Ich habe meine Antwort bearbeitet, um zu vereinfachen, wie die Funktion aufgerufen wird, mit zwei einzelnen Werten zur Eingabe (erste Reihe, letzte Reihe) – djv

Antwort

0

Sie können eine LINQ-Ausdruck verwenden, um eine zählbare Sammlung der Werte erhalten Sie bearbeiten möchten, dann integrierte Funktionen verwenden, um die max, min zu bekommen, und durchschnittlich

eine Struktur definieren, welche die resultierende halten wird Berechnungen

Private Structure ResultsStruct 
    Public Min As Single 
    Public Max As Single 
    Public Average As Single 
    Public Sum As Single 
End Structure 

Diese Funktion gibt die Struktur beim Aufruf zurück. Übergeben Sie den Index der ersten Zeile und den Index der letzten Zeile.

Private Function getResults(firstRow As Integer, lastRow As Integer) As ResultsStruct 
    Dim skipRows = firstRow - 1 
    Dim takeRows = lastRow - skipRows 
    Dim values = DataGridView1.Rows. 
     OfType(Of DataGridViewRow)(). 
     Select(Of Single)(Function(r) Single.Parse(r.Cells(0).Value.ToString())). 
     Skip(skipRows). 
     Take(takeRows) 
    Dim max = values.Max() 
    Dim min = values.Min() 
    Dim avg = values.Average() 
    Dim result As New ResultsStruct() With {.Max = values.Max(), 
              .Min = values.Min(), 
              .Average = values.Average(), 
              .Sum = values.Sum()} 
    Return result 
End Function 

Wie es mit dem Bereich sind Sie interessiert, ob es von dem Benutzer ist die Auswahl des Gitters oder einige andere Mittel zur Eingabe

Dim result = getResults(firstRow:=201, lastRow:=300) 
MessageBox.Show(String.Format("Max: {0}, Min: {1}, Avg: {2}, Sum: {3}", 
           result.Max, result.Min, result.Average, result.Sum)) 

ersetzen 201 und 300 im Beispiel genannt wird.

+0

danke für die Antwort, jetzt lösen sie mein "Tief des Grundwissens": D – Yon