热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

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

DataGridViewSumRow类
Public   Class DataGridViewSumRow Class DataGridViewSumRow

    
Private dt As DataTable
    
Dim dtSum As DataTable
    
Private ROW_HEIGHT As Integer = 21 ''行高

    
Private Sub DataGridViewSumRow_Load()Sub DataGridViewSumRow_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        VScrollBar1.Visible 
= False
    
End Sub


    
Private Sub Button1_Click()Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        dt 
= GetData()
        
Me.DataGridView1.DataSource = dt
        
Me.DataGridView1.RowTemplate.Height = ROW_HEIGHT

        GetSumData()

        
''行数超过当前页显示时显示纵向滚动条
        If dt.Rows.Count > 13 Then

            VScrollBar1.Visible 
= True
            
''总长度为 (所有行数 - 画面一页显示行数) × 行高
            VScrollBar1.Maximum = (Me.DataGridView1.Rows.Count - Me.DataGridView1.DisplayedRowCount(False)) * ROW_HEIGHT
            VScrollBar1.Minimum 
= 0
            VScrollBar1.SmallChange 
= 21
            VScrollBar1.LargeChange 
= 50

        
End If

    
End Sub



    
''' 
    ''' 合计取得设定
    ''' 

    ''' 

    
Private Sub GetSumData()Sub GetSumData()
        
Dim dr As DataRow

        dtSum 
= New DataTable("TEST")

        dtSum 
= dt.Clone

        
Dim rdm As Random = New Random
        dr 
= dtSum.NewRow()
        dr(
0= "合计"

        
For i As Integer = 1 To dt.Columns.Count - 1
            dr(i) 
= dt.Compute("Sum(" + dt.Columns(i).ColumnName + ")""true")
        
Next
        dtSum.Rows.Add(dr)

        
Me.DataGridViewSum.DataSource = dtSum
        
Me.DataGridViewSum.Rows(0).DefaultCellStyle.BackColor = Color.Brown
        
Me.DataGridViewSum.ReadOnly = True
        
Me.DataGridViewSum.SelectionMode = DataGridViewSelectionMode.FullRowSelect

    
End Sub


    
''' 
    ''' 数据取得
    ''' 

    ''' 
    ''' 

    
Public Function GetData()Function GetData() As DataTable

        
Dim dt As DataTable
        
Dim dr As DataRow

        dt 
= New DataTable("TEST")
        dt.Columns.Add(
New DataColumn("号码"GetType(String)))
        dt.Columns.Add(
New DataColumn("数量1"GetType(Integer)))
        dt.Columns.Add(
New DataColumn("数量2"GetType(Integer)))
        dt.Columns.Add(
New DataColumn("数量3"GetType(Integer)))
        dt.Columns.Add(
New DataColumn("数量4"GetType(Integer)))
        dt.Columns.Add(
New DataColumn("数量5"GetType(Integer)))
        dt.Columns.Add(
New DataColumn("数量6"GetType(Integer)))
        dt.Columns.Add(
New DataColumn("数量7"GetType(Integer)))
        dt.Columns.Add(
New DataColumn("数量8"GetType(Integer)))
        dt.Columns.Add(
New DataColumn("数量9"GetType(Integer)))

        
Dim rdm As Random = New Random

        
For i As Integer = 10 To 80
            dr 
= dt.NewRow()
            dr(
0= "00" & i.ToString
            
For j As Integer = 1 To 9
                dr(j) 
= rdm.Next(10005000)
            
Next
            dt.Rows.Add(dr)
        
Next

        
Return dt
    
End Function


    
''' 
    ''' 纵滚动条事件
    ''' 

    ''' 
    ''' 
    ''' 
    Private Sub VScrollBar1_Scroll()Sub VScrollBar1_Scroll(ByVal sender As ObjectByVal e As System.Windows.Forms.ScrollEventArgs) Handles VScrollBar1.Scroll
        
'Debug.WriteLine(e.NewValue.ToString)
        Me.DataGridView1.FirstDisplayedScrollingRowIndex = e.NewValue  ROW_HEIGHT

    
End Sub


    
Private Sub Button2_Click()Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        
Me.Close()
    
End Sub



    
''' 
    ''' 合计DataGridView的滚动条事件
    ''' 

    ''' 
    ''' 
    ''' 

    
Private Sub DataGridViewSum_Scroll()Sub DataGridViewSum_Scroll(ByVal sender As ObjectByVal e As System.Windows.Forms.ScrollEventArgs) Handles DataGridViewSum.Scroll
        
Me.DataGridView1.HorizontalScrollingOffset = e.NewValue
    
End Sub


    
''' 
    ''' 数据变更后重新合计
    ''' 

    ''' 
    ''' 
    ''' 
    Private Sub DataGridView1_CellValueChanged()Sub DataGridView1_CellValueChanged(ByVal sender As ObjectByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
        
If e.ColumnIndex <= 0 Then
            
Exit Sub
        
End If
        
''DetaGridView中数据变化后重新合计
        Me.DataGridViewSum(e.ColumnIndex, 0).Value = dt.Compute("Sum(" + dt.Columns(e.ColumnIndex).ColumnName + ")""true")
    
End Sub



    
''' 
    ''' 响应鼠标滚轴事件
    ''' 

    ''' 
    ''' 
    ''' 
    Private Sub DataGridViewSumRow_MouseWheel()Sub DataGridViewSumRow_MouseWheel(ByVal sender As ObjectByVal e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseWheel

        
If VScrollBar1.Visible = False Then
            
Exit Sub
        
End If

        
If VScrollBar1.Value - ROW_HEIGHT < 0 And e.Delta > 0 Then
            VScrollBar1.Value 
= VScrollBar1.Minimum
            
Exit Sub
        
End If

        
If VScrollBar1.Value + ROW_HEIGHT > VScrollBar1.Maximum And e.Delta < 0 Then
            VScrollBar1.Value 
= VScrollBar1.Maximum
            
Exit Sub
        
End If

        
Try
            VScrollBar1.Value 
-= CInt(e.Delta / Math.Abs(e.Delta) * ROW_HEIGHT)
        
Catch ex As Exception
            Debug.WriteLine(
"###########################")
            Debug.WriteLine(
"VScrollBar1.Value = " & VScrollBar1.Value)
            Debug.WriteLine(
"e.Delta = " & e.Delta)
            Debug.WriteLine(
"###########################")
        
End Try
        
Me.DataGridView1.FirstDisplayedScrollingRowIndex = VScrollBar1.Value  ROW_HEIGHT

    
End Sub

End Class

效果如下

推荐阅读
  • 涉及的知识点-ViewGroup的测量与布局-View的测量与布局-滑动冲突的处理-VelocityTracker滑动速率跟踪-Scroller实现弹性滑动-屏幕宽高的获取等实现步 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了Cocos2dx学习笔记中的更新函数scheduleUpdate、进度计时器CCProgressTo和滚动视图CCScrollView的用法。详细介绍了scheduleUpdate函数的作用和使用方法,以及schedule函数的区别。同时,还提供了相关的代码示例。 ... [详细]
  • PHP反射API的功能和用途详解
    本文详细介绍了PHP反射API的功能和用途,包括动态获取信息和调用对象方法的功能,以及自动加载插件、生成文档、扩充PHP语言等用途。通过反射API,可以获取类的元数据,创建类的实例,调用方法,传递参数,动态调用类的静态方法等。PHP反射API是一种内建的OOP技术扩展,通过使用Reflection、ReflectionClass和ReflectionMethod等类,可以帮助我们分析其他类、接口、方法、属性和扩展。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了brain的意思、读音、翻译、用法、发音、词组、同反义词等内容,以及脑新东方在线英语词典的相关信息。还包括了brain的词汇搭配、形容词和名词的用法,以及与brain相关的短语和词组。此外,还介绍了与brain相关的医学术语和智囊团等相关内容。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
author-avatar
人忒多
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有