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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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:
1 2 3 4 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 |
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ę:
1 2 3 4 5 6 7 8 9 |
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ę:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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
Author
Dzięki, poprawione