Rubrik: Controls · DataGrid & DataGridView | VB-Versionen: VB2008, VB2010 | 21.12.12 |
Eine Methode zum Erzeugen einer Summenzeile zu einem Datagridview Es wird eine einfache Methode zum Anzeigen von Summen zu bestimmten Spalten eines Datagridview vorgestellt. | ||
Autor: Dietrich Herrmann | Bewertung: | Views: 10.501 |
ohne Homepage | System: Win7, Win8, Win10, Win11 | kein Beispielprojekt |
Es gibt zwar im Internet einige Lösungen zu der Problematik, wie man unter einem DataGridView eine einfache Summenzeile erzeugen kann, in der zu bestimmten Spalten des DGV die Summenwerte angezeigt werden. Ich habe in meinem Vorschlag einfach nur "Bordmittel" von VB verwendet und erzeuge diese Summenzeile mittels eines zweiten DGV mit nur einer Zeile.
Hier die Vorgehensweise:
- Möglichst in einen Container setzt man die beiden DGV's; das für die Summen mit Dock = Bottom und das DGV für die Daten mit Dock = Fill.
- Das Daten-DGV (bspw. dgvDaten genannt) richtet man nach den Erfordernissen ein, es kann daten- oder ungebunden sein.
- Das Summen-DGV (bspw. dgvSummen genannt) richtet man in der gewünschten Höhe ein, ohne ColumnHeaders. Es sollte auch ReadOnly sein. Und es muss noch folgende Eigenschaften haben:
With dgvSummen .RowCount = 1 .BorderStyle = None .ColumnCount = dgvDaten.ColumnCount .ColumnsHeadersVisible = False .ReadOnly = True .AutoSizeColumnsMode = dgvDaten.AutoSizeColumnsMode .ScrollBars = ScrollBars.None .RowHeadersVisible = False ' oder True (genau wie in dgvDaten definieren) End With
Die folgende Hilfsfunktion erledigt die Ermittlung der Summen für vorgegebene Spalten. Der Parameter colFeld() soll die Namen oder Indizes der für Summierung zu berücksichtigenden Spalten enthalten.
Also bspw.:
Dim summCols() As String = {"Bruttbetrag", "Nettobetrag", "Mwst"}
oder etwa
Dim summCols() As Short= {3, 2, 4}
Die Funktion:
Sub summZeile(colFeld() As Object) ' Summieren von Spalten If dgvDaten.RowCount = 0 Then Exit Sub Dim idc As Short ' Löschen der Summenfelder For Each dc As DataGridViewCell In dgvSummen.Rows(0).Cells dc.Value = DBNull.Value Next ' Berechnen der Summenfelder gemäß der vorgegebenen Spalten For i As Short = 0 To dgvDaten.RowCount - 1 For j As Short = 0 To colFeld.Length - 1 idc = dgvDaten.Columns(colFeld(j)).Index If dgvDaten.Columns(colFeld(j)).Visible Then With dgvSummen.Rows(0).Cells(idc) If IsDBNull(.Value) Then .Value = 0 .Value += If(IsDBNull(dgvDaten.Rows(i).Cells(idc).Value), 0, _ dgvDaten.Rows(i).Cells(idc).Value) .Style.Alignment = DataGridViewContentAlignment.MiddleRight End With End If Next Next End Sub
Diese Funktion rufe ich nach dem Laden des dgvDaten auf (beim DataSource-festlegen bspw.), insbesondere auch dann, wenn ich auf dgvDaten Filter anwende.
Allerdings muss das Summen-DGV noch im Erscheinungsbild mit dem Daten-DGV so zu sagen synchronisiert werden, Stichwort Spaltenbreiten und horizontales Scrollen. Im Paint-Ereignis von dgvDaten folgenden Code einsetzen für das Setzen der Spaltenbreiten:
With dgvSummen .RowHeadersWidth = dgvDaten.RowHeadersWidth ' falls definiert! For i As Short = 0 To dgvDaten.Columns.Count - 1 If dgvDaten.Columns(i).Visible Then .Columns(i).Width = dgvDaten.Columns(i).Width Next .Height = .Rows(0).Height ' dieser Text und auch die Zelle sind nur ein Beispiel von mir! .Rows(0).Cells(3).Value = "Summen" End With
Nun noch das Scrollen einrichten. Das Synchronisieren des horizontalen Scrollens der beiden DGV's erreicht man mit:
Private Sub dgvDaten_Scroll(sender As Object, e As ScrollEventArgs) _ Handles dgvDaten.Scroll dgvSummen.HorizontalScrollingOffset = dgvDaten.HorizontalScrollingOffset End Sub
Das ist schon alles. Wer möchte kann statt Summen auch eventuell benötigte Spalten-Mittelwerte ermitteln und eintragen.