Sumowanie wybranych komórek w DataGridView | różne metody

Spróbuje dzisiaj pokazać kilka sposobów sumowania wybieranych ręcznie komórek w DataGridView. Stworzyłem sobie formę taką jak na obrazku poniżej:

sumowanie_komorek_2

 

Na dole mamy trzy obiekty „Label” z text=”Suma :” i trzy „TextBoxy” Dodałem trzy „DataGridView” i dodałem do nich dwie kolumny:

sumowanie_komorek_3

 

Wypełniam je za pomocą kodu:

Public Class Form1
    Dim ImionaNazwiska As String() = {"Adam Niezgódka", "Marcin Mordel", "Damian Zgóba", _
                                      "Marlena Graboś", "Marek Hekler", "Karol Król", "Karol Pozdar", _
                                      "Michał Młot", "karolina Kaska", "Aldona Moda"}

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim rnd As New Random
        For i As Integer = 0 To ImionaNazwiska.Count - 1
            DataGridView1.Rows.Add()
            DataGridView1.Rows(i).Cells(0).Value = ImionaNazwiska(i)
            DataGridView1.Rows(i).Cells(1).Value = rnd.Next(1, 100)

            DataGridView2.Rows.Add()
            DataGridView2.Rows(i).Cells(0).Value = ImionaNazwiska(i)
            DataGridView2.Rows(i).Cells(1).Value = rnd.Next(1, 100)

            DataGridView3.Rows.Add()
            DataGridView3.Rows(i).Cells(0).Value = ImionaNazwiska(i)
            DataGridView3.Rows(i).Cells(1).Value = rnd.Next(1, 100)
        Next
    End Sub

(...)

 

Po odpaleniu wygląda to tak:

sumowanie_komorek_4

Pierwszy sposób sumuje wybrane wiersze. Wybieramy naszą tabelę i przełączamy we „Właściwościach” na „Zdarzenie:

sumowanie_komorek

Znajdujemy wiersz z napisem „SelectionChange” i klikamy dwukrotnie lewym przyciskiem myszki na puste pole obok niego:

sumowanie_komorek_1

 

Teraz powinno utworzyć nam uchwyt do „SelectionChange” i automatycznie przenieść na widok kodu naszej formy. Aby w pierwszym „TextBoxie” Pojawiły się sumy musimy w kodzie wybrać która kolumna ma być podliczana:

    Private Sub DataGridView1_SelectionChanged(sender As Object, e As EventArgs) Handles DataGridView1.SelectionChanged
        TextBox1.Text = (From row As DataGridViewRow In DataGridView1.Rows.Cast(Of DataGridViewRow)() Where row.Selected = True 
                        Select CInt(row.Cells(1).Value)).Sum.ToString 'sumuje dane z kolumny numer "row.Cells("nazwa lub numer kolumny")"
    End Sub

Jest to dobra metoda ale wymaga od użytkownika dość dużej ingerencji, i świadomości które komórki się sumują. Moim zdaniem metoda bezpieczna, gdyż przez wskazanie który wiersz ma być sumowany unikamy kłopotu wystąpienia nieliczbowych danych lub pustych komórek. Wygląda to tak:

sumowanie_komorek_5

Kolejna metoda jest bardzo użyteczna ale tylko wtedy gdy nie mamy do czynienia z komurkami typu „DBnull” czyli tymi pustymi. Tworzymy uchwyt „SelectionChanged” dla kolejnego DatagridView . Wypełniamy go kodem:

    Private Sub DataGridView2_SelectionChanged(sender As Object, e As EventArgs) Handles DataGridView2.SelectionChanged
        Dim i As Double = 0
        'Konwertuje ciąg reprezentujący liczbę w określonym stylu i format specyficzne dla kultury 
        'jego 32-bitowa podpisana liczba całkowita równoważne.
        ' Zwracana wartość wskazuje, czy konwersja powiodła się.
        If DataGridView2.SelectedCells.Cast(Of DataGridViewCell).Any(Function(f) Not Double.TryParse(f.Value, i)) Then
            TextBox2.Text = 0 'Ustawia wartość textboxu na 0 jeśli nie uda mu się przekształcić wartości komórki na typ double
        Else
            Dim Sum = DataGridView2.SelectedCells.Cast(Of DataGridViewCell).Sum(Function(f) f.Value)
            TextBox2.Text = Sum.ToString 'Jeśli się uda sumuje wybrane komórki
        End If
    End Sub

A wygląda to tak:

sumowanie_komorek_6

Niestety przy używaniu Bazy danych omyłkowo użytkownik wybierze pustą komurkę typu „DBnull” dostanie oto taki komunikat:

sumowanie_komorek_7

Dobra metoda ale trzeba uważać gdyż może powodować błędy. Ostatnia metoda którą tutaj przedstawia jest jak dla mnie najdoskonalsza. Pozwala na zrozumiałe jej modyfikowanie. Aby jej użyć musimy sobie najpierw dodać funkcję:

    Public Function SprawdzWartoscKomurki(ByVal WartoscKomorki As String) As Boolean
        Try
            Dim value As Double
            value = CDbl(WartoscKomorki) 'Sprawdza czy wartość komórki jest typu double
            Return True 'jeśli jest zwraca True
        Catch ex As Exception
            Return False
        End Try
    End Function

Metoda generująca sumę:

    Private Sub DataGridView3_SelectionChanged(sender As Object, e As EventArgs) Handles DataGridView3.SelectionChanged
        Try
            Dim Komorka As DataGridViewCell
            Dim Suma As Double

            For Each Komorka In DataGridView3.SelectedCells
                If SprawdzWartoscKomurki(Komorka.Value) = True Then
                    Suma = Suma + Komorka.Value
                End If
            Next
            TextBox3.Text = Suma
        Catch ex As Exception
            Debug.Print(ex.ToString)
        End Try
    End Sub

Po odpaleniu wygląda to tak:

sumowanie_komorek_8

 

Każdy może wybrać najbardziej odpowiadającą mu metodę. Tak jak zawsze projekt do pobrania tutaj: sumowanie_komorek_DataGridView

Permalink do tego artykułu: https://visualmonsters.cba.pl/sumowanie-wybranych-komorek-w-datagridview-rozne-metody/

2 Komentarze

  1. Witam
    Fajny i przydatny opis.
    Tylko mała uwaga (nie złośliwa) w zdaniu „Niestety przy używaniu Bazy danych omyłkowo użytkownik wybierze pustą komurkę typu „DBnull” dostanie oto taki komunikat:” wkradł się błąd ortograficzny. Podejrzewam że prze pośpiech. Pozdrawiam

  2. Dzięki, poprawione

Dodaj komentarz

Twój adres email nie będzie publikowany.