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:
Na dole mamy trzy obiekty „Label” z text=”Suma :” i trzy „TextBoxy” Dodałem trzy „DataGridView” i dodałem do nich dwie kolumny:
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:
Pierwszy sposób sumuje wybrane wiersze. Wybieramy naszą tabelę i przełączamy we „Właściwościach” na „Zdarzenie:
Znajdujemy wiersz z napisem „SelectionChange” i klikamy dwukrotnie lewym przyciskiem myszki na puste pole obok niego:
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:
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:
Niestety przy używaniu Bazy danych omyłkowo użytkownik wybierze pustą komurkę typu „DBnull” dostanie oto taki komunikat:
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:
Każdy może wybrać najbardziej odpowiadającą mu metodę. Tak jak zawsze projekt do pobrania tutaj: sumowanie_komorek_DataGridView











2 komentarze
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
Autor
Dzięki, poprawione