DataGridView实现添加合计行并始终显示在底部

时间:2022-12-11 14:45:19
DataGridView中没有合适的方法来冻结底部的合计行,这里用一种比较简单的方式实现。
1. 数据部分的DataGridView,不带任何滚动框
2.合计部分的DataGridView,带有横向滚动框
3.在画面上添加一个纵向滚动框
实现的主要思路就是用合计行的横向滚动框控制两个DataGridView的横向滚动,右侧的纵向滚动狂控制数据部分的DataGridView,效果看起来就是合计行始终显示。

该例实现了合计行的自动计算,取数据的部分是用程序做的DataTable

DataGridViewSumRow类
DataGridView实现添加合计行并始终显示在底部DataGridView实现添加合计行并始终显示在底部Public   Class DataGridViewSumRow Class DataGridViewSumRow
DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部    
Private dt As DataTable
DataGridView实现添加合计行并始终显示在底部    
Dim dtSum As DataTable
DataGridView实现添加合计行并始终显示在底部    
Private ROW_HEIGHT As Integer = 21 ''行高
DataGridView实现添加合计行并始终显示在底部

DataGridView实现添加合计行并始终显示在底部DataGridView实现添加合计行并始终显示在底部    
Private Sub DataGridViewSumRow_Load()Sub DataGridViewSumRow_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
DataGridView实现添加合计行并始终显示在底部        VScrollBar1.Visible 
= False
DataGridView实现添加合计行并始终显示在底部    
End Sub

DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部DataGridView实现添加合计行并始终显示在底部    
Private Sub Button1_Click()Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部        dt 
= GetData()
DataGridView实现添加合计行并始终显示在底部        
Me.DataGridView1.DataSource = dt
DataGridView实现添加合计行并始终显示在底部        
Me.DataGridView1.RowTemplate.Height = ROW_HEIGHT
DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部        GetSumData()
DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部        
''行数超过当前页显示时显示纵向滚动条
DataGridView实现添加合计行并始终显示在底部
        If dt.Rows.Count > 13 Then
DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部            VScrollBar1.Visible 
= True
DataGridView实现添加合计行并始终显示在底部            
''总长度为 (所有行数 - 画面一页显示行数) × 行高
DataGridView实现添加合计行并始终显示在底部
            VScrollBar1.Maximum = (Me.DataGridView1.Rows.Count - Me.DataGridView1.DisplayedRowCount(False)) * ROW_HEIGHT
DataGridView实现添加合计行并始终显示在底部            VScrollBar1.Minimum 
= 0
DataGridView实现添加合计行并始终显示在底部            VScrollBar1.SmallChange 
= 21
DataGridView实现添加合计行并始终显示在底部            VScrollBar1.LargeChange 
= 50
DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部        
End If
DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部    
End Sub

DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部    
''' <summary>
DataGridView实现添加合计行并始终显示在底部
    ''' 合计取得设定
DataGridView实现添加合计行并始终显示在底部
    ''' </summary>
DataGridView实现添加合计行并始终显示在底部
    ''' <remarks></remarks>
DataGridView实现添加合计行并始终显示在底部

DataGridView实现添加合计行并始终显示在底部DataGridView实现添加合计行并始终显示在底部    
Private Sub GetSumData()Sub GetSumData()
DataGridView实现添加合计行并始终显示在底部        
Dim dr As DataRow
DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部        dtSum 
= New DataTable("TEST")
DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部        dtSum 
= dt.Clone
DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部        
Dim rdm As Random = New Random
DataGridView实现添加合计行并始终显示在底部        dr 
= dtSum.NewRow()
DataGridView实现添加合计行并始终显示在底部        dr(
0= "合计"
DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部        
For i As Integer = 1 To dt.Columns.Count - 1
DataGridView实现添加合计行并始终显示在底部            dr(i) 
= dt.Compute("Sum(" + dt.Columns(i).ColumnName + ")""true")
DataGridView实现添加合计行并始终显示在底部        
Next
DataGridView实现添加合计行并始终显示在底部        dtSum.Rows.Add(dr)
DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部        
Me.DataGridViewSum.DataSource = dtSum
DataGridView实现添加合计行并始终显示在底部        
Me.DataGridViewSum.Rows(0).DefaultCellStyle.BackColor = Color.Brown
DataGridView实现添加合计行并始终显示在底部        
Me.DataGridViewSum.ReadOnly = True
DataGridView实现添加合计行并始终显示在底部        
Me.DataGridViewSum.SelectionMode = DataGridViewSelectionMode.FullRowSelect
DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部    
End Sub

DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部    
''' <summary>
DataGridView实现添加合计行并始终显示在底部
    ''' 数据取得
DataGridView实现添加合计行并始终显示在底部
    ''' </summary>
DataGridView实现添加合计行并始终显示在底部
    ''' <returns></returns>
DataGridView实现添加合计行并始终显示在底部
    ''' <remarks></remarks>
DataGridView实现添加合计行并始终显示在底部

DataGridView实现添加合计行并始终显示在底部DataGridView实现添加合计行并始终显示在底部    
Public Function GetData()Function GetData() As DataTable
DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部        
Dim dt As DataTable
DataGridView实现添加合计行并始终显示在底部        
Dim dr As DataRow
DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部        dt 
= New DataTable("TEST")
DataGridView实现添加合计行并始终显示在底部        dt.Columns.Add(
New DataColumn("号码"GetType(String)))
DataGridView实现添加合计行并始终显示在底部        dt.Columns.Add(
New DataColumn("数量1"GetType(Integer)))
DataGridView实现添加合计行并始终显示在底部        dt.Columns.Add(
New DataColumn("数量2"GetType(Integer)))
DataGridView实现添加合计行并始终显示在底部        dt.Columns.Add(
New DataColumn("数量3"GetType(Integer)))
DataGridView实现添加合计行并始终显示在底部        dt.Columns.Add(
New DataColumn("数量4"GetType(Integer)))
DataGridView实现添加合计行并始终显示在底部        dt.Columns.Add(
New DataColumn("数量5"GetType(Integer)))
DataGridView实现添加合计行并始终显示在底部        dt.Columns.Add(
New DataColumn("数量6"GetType(Integer)))
DataGridView实现添加合计行并始终显示在底部        dt.Columns.Add(
New DataColumn("数量7"GetType(Integer)))
DataGridView实现添加合计行并始终显示在底部        dt.Columns.Add(
New DataColumn("数量8"GetType(Integer)))
DataGridView实现添加合计行并始终显示在底部        dt.Columns.Add(
New DataColumn("数量9"GetType(Integer)))
DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部        
Dim rdm As Random = New Random
DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部        
For i As Integer = 10 To 80
DataGridView实现添加合计行并始终显示在底部            dr 
= dt.NewRow()
DataGridView实现添加合计行并始终显示在底部            dr(
0= "00" & i.ToString
DataGridView实现添加合计行并始终显示在底部            
For j As Integer = 1 To 9
DataGridView实现添加合计行并始终显示在底部                dr(j) 
= rdm.Next(10005000)
DataGridView实现添加合计行并始终显示在底部            
Next
DataGridView实现添加合计行并始终显示在底部            dt.Rows.Add(dr)
DataGridView实现添加合计行并始终显示在底部        
Next
DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部        
Return dt
DataGridView实现添加合计行并始终显示在底部    
End Function

DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部    
''' <summary>
DataGridView实现添加合计行并始终显示在底部
    ''' 纵滚动条事件
DataGridView实现添加合计行并始终显示在底部
    ''' </summary>
DataGridView实现添加合计行并始终显示在底部
    ''' <param name="sender"></param>
DataGridView实现添加合计行并始终显示在底部
    ''' <param name="e"></param>
DataGridView实现添加合计行并始终显示在底部
    ''' <remarks></remarks>
DataGridView实现添加合计行并始终显示在底部DataGridView实现添加合计行并始终显示在底部
    Private Sub VScrollBar1_Scroll()Sub VScrollBar1_Scroll(ByVal sender As ObjectByVal e As System.Windows.Forms.ScrollEventArgs) Handles VScrollBar1.Scroll
DataGridView实现添加合计行并始终显示在底部        
'Debug.WriteLine(e.NewValue.ToString)
DataGridView实现添加合计行并始终显示在底部
        Me.DataGridView1.FirstDisplayedScrollingRowIndex = e.NewValue  ROW_HEIGHT
DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部    
End Sub

DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部DataGridView实现添加合计行并始终显示在底部    
Private Sub Button2_Click()Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
DataGridView实现添加合计行并始终显示在底部        
Me.Close()
DataGridView实现添加合计行并始终显示在底部    
End Sub

DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部    
''' <summary>
DataGridView实现添加合计行并始终显示在底部
    ''' 合计DataGridView的滚动条事件
DataGridView实现添加合计行并始终显示在底部
    ''' </summary>
DataGridView实现添加合计行并始终显示在底部
    ''' <param name="sender"></param>
DataGridView实现添加合计行并始终显示在底部
    ''' <param name="e"></param>
DataGridView实现添加合计行并始终显示在底部
    ''' <remarks></remarks>
DataGridView实现添加合计行并始终显示在底部

DataGridView实现添加合计行并始终显示在底部DataGridView实现添加合计行并始终显示在底部    
Private Sub DataGridViewSum_Scroll()Sub DataGridViewSum_Scroll(ByVal sender As ObjectByVal e As System.Windows.Forms.ScrollEventArgs) Handles DataGridViewSum.Scroll
DataGridView实现添加合计行并始终显示在底部        
Me.DataGridView1.HorizontalScrollingOffset = e.NewValue
DataGridView实现添加合计行并始终显示在底部    
End Sub

DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部    
''' <summary>
DataGridView实现添加合计行并始终显示在底部
    ''' 数据变更后重新合计
DataGridView实现添加合计行并始终显示在底部
    ''' </summary>
DataGridView实现添加合计行并始终显示在底部
    ''' <param name="sender"></param>
DataGridView实现添加合计行并始终显示在底部
    ''' <param name="e"></param>
DataGridView实现添加合计行并始终显示在底部
    ''' <remarks></remarks>
DataGridView实现添加合计行并始终显示在底部DataGridView实现添加合计行并始终显示在底部
    Private Sub DataGridView1_CellValueChanged()Sub DataGridView1_CellValueChanged(ByVal sender As ObjectByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
DataGridView实现添加合计行并始终显示在底部        
If e.ColumnIndex <= 0 Then
DataGridView实现添加合计行并始终显示在底部            
Exit Sub
DataGridView实现添加合计行并始终显示在底部        
End If
DataGridView实现添加合计行并始终显示在底部        
''DetaGridView中数据变化后重新合计
DataGridView实现添加合计行并始终显示在底部
        Me.DataGridViewSum(e.ColumnIndex, 0).Value = dt.Compute("Sum(" + dt.Columns(e.ColumnIndex).ColumnName + ")""true")
DataGridView实现添加合计行并始终显示在底部    
End Sub

DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部    
''' <summary>
DataGridView实现添加合计行并始终显示在底部
    ''' 响应鼠标滚轴事件
DataGridView实现添加合计行并始终显示在底部
    ''' </summary>
DataGridView实现添加合计行并始终显示在底部
    ''' <param name="sender"></param>
DataGridView实现添加合计行并始终显示在底部
    ''' <param name="e"></param>
DataGridView实现添加合计行并始终显示在底部
    ''' <remarks></remarks>
DataGridView实现添加合计行并始终显示在底部DataGridView实现添加合计行并始终显示在底部
    Private Sub DataGridViewSumRow_MouseWheel()Sub DataGridViewSumRow_MouseWheel(ByVal sender As ObjectByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseWheel
DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部        
If VScrollBar1.Visible = False Then
DataGridView实现添加合计行并始终显示在底部            
Exit Sub
DataGridView实现添加合计行并始终显示在底部        
End If
DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部        
If VScrollBar1.Value - ROW_HEIGHT < 0 And e.Delta > 0 Then
DataGridView实现添加合计行并始终显示在底部            VScrollBar1.Value 
= VScrollBar1.Minimum
DataGridView实现添加合计行并始终显示在底部            
Exit Sub
DataGridView实现添加合计行并始终显示在底部        
End If
DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部        
If VScrollBar1.Value + ROW_HEIGHT > VScrollBar1.Maximum And e.Delta < 0 Then
DataGridView实现添加合计行并始终显示在底部            VScrollBar1.Value 
= VScrollBar1.Maximum
DataGridView实现添加合计行并始终显示在底部            
Exit Sub
DataGridView实现添加合计行并始终显示在底部        
End If
DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部        
Try
DataGridView实现添加合计行并始终显示在底部            VScrollBar1.Value 
-= CInt(e.Delta / Math.Abs(e.Delta) * ROW_HEIGHT)
DataGridView实现添加合计行并始终显示在底部        
Catch ex As Exception
DataGridView实现添加合计行并始终显示在底部            Debug.WriteLine(
"###########################")
DataGridView实现添加合计行并始终显示在底部            Debug.WriteLine(
"VScrollBar1.Value = " & VScrollBar1.Value)
DataGridView实现添加合计行并始终显示在底部            Debug.WriteLine(
"e.Delta = " & e.Delta)
DataGridView实现添加合计行并始终显示在底部            Debug.WriteLine(
"###########################")
DataGridView实现添加合计行并始终显示在底部        
End Try
DataGridView实现添加合计行并始终显示在底部        
Me.DataGridView1.FirstDisplayedScrollingRowIndex = VScrollBar1.Value  ROW_HEIGHT
DataGridView实现添加合计行并始终显示在底部
DataGridView实现添加合计行并始终显示在底部    
End Sub

DataGridView实现添加合计行并始终显示在底部
End Class

效果如下
DataGridView实现添加合计行并始终显示在底部