vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#

https://www.vbarchiv.net
Rubrik: Controls · DataGrid & DataGridView   |   VB-Versionen: VB2008, VB201021.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 HerrmannBewertung:  Views:  10.501 
ohne HomepageSystem:  Win7, Win8, Win10, Win11kein 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.



Anzeige

Kauftipp Unser Dauerbrenner!Diesen und auch alle anderen Tipps & Tricks finden Sie auch auf unserer aktuellen vb@rchiv  Vol.6

Ein absolutes Muss - Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
- nahezu alle Tipps & Tricks und Workshops mit Beispielprojekten
- Symbol-Galerie mit mehr als 3.200 Icons im modernen Look
Weitere Infos - 4 Entwickler-Vollversionen (u.a. sevFTP für .NET), Online-Update-Funktion u.v.m.
 
 
Copyright ©2000-2024 vb@rchiv Dieter OtterAlle Rechte vorbehalten.


Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.