zoukankan      html  css  js  c++  java
  • DataGridView冻结底部的合计行

    1. 数据部分的DataGridView,不带任何滚动框
    2.合计部分的DataGridView,带有横向滚动框
    3.在画面上添加一个纵向滚动框
    实现的主要思路就是用合计行的横向滚动框控制两个DataGridView的横向滚动,右侧的纵向滚动狂控制数据部分的DataGridView,效果看起来就是合计行始终显示。

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

    DataGridViewSumRow类
    代码
      1 Public Class DataGridViewSumRow
      2 {
      3 private DataTable dt;
      4 DataTable dtSum;
      5 //'行高
      6 private int ROW_HEIGHT = 21;
      7 
      8 private void DataGridViewSumRow_Load(System.Object sender, System.EventArgs e)
      9 {
     10     VScrollBar1.Visible = false;
     11 }
     12 
     13 private void Button1_Click(System.Object sender, System.EventArgs e)
     14 {
     15     dt = GetData();
     16     this.DataGridView1.DataSource = dt;
     17     this.DataGridView1.RowTemplate.Height = ROW_HEIGHT;
     18 
     19     GetSumData();
     20 
     21     //'行数超过当前页显示时显示纵向滚动条
     22 
     23     if (dt.Rows.Count > 13) {
     24         VScrollBar1.Visible = true;
     25         //'总长度为 (所有行数 - 画面一页显示行数) × 行高
     26         VScrollBar1.Maximum = (this.DataGridView1.Rows.Count - this.DataGridView1.DisplayedRowCount(false)) * ROW_HEIGHT;
     27         VScrollBar1.Minimum = 0;
     28         VScrollBar1.SmallChange = 21;
     29         VScrollBar1.LargeChange = 50;
     30 
     31     }
     32 }
     33 
     34 /// <summary>
     35 /// 合计取得设定
     36 /// </summary>
     37 /// <remarks></remarks>
     38 private void GetSumData()
     39 {
     40     DataRow dr = null;
     41 
     42     dtSum = new DataTable("TEST");
     43 
     44     dtSum = dt.Clone;
     45 
     46     Random rdm = new Random();
     47     dr = dtSum.NewRow();
     48     dr(0= "合计";
     49 
     50     for (int i = 1; i <= dt.Columns.Count - 1; i++) {
     51         dr(i) = dt.Compute("Sum(" + dt.Columns(i).ColumnName + ")""true");
     52     }
     53     dtSum.Rows.Add(dr);
     54 
     55     this.DataGridViewSum.DataSource = dtSum;
     56     this.DataGridViewSum.Rows(0).DefaultCellStyle.BackColor = Color.Brown;
     57     this.DataGridViewSum.ReadOnly = true;
     58     this.DataGridViewSum.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
     59 
     60 }
     61 
     62 /// <summary>
     63 /// 数据取得
     64 /// </summary>
     65 /// <returns></returns>
     66 /// <remarks></remarks>
     67 public DataTable GetData()
     68 {
     69     DataTable dt = null;
     70     DataRow dr = null;
     71 
     72     dt = new DataTable("TEST");
     73     dt.Columns.Add(new DataColumn("号码"typeof(string)));
     74     dt.Columns.Add(new DataColumn("数量1"typeof(int)));
     75     dt.Columns.Add(new DataColumn("数量2"typeof(int)));
     76     dt.Columns.Add(new DataColumn("数量3"typeof(int)));
     77     dt.Columns.Add(new DataColumn("数量4"typeof(int)));
     78     dt.Columns.Add(new DataColumn("数量5"typeof(int)));
     79     dt.Columns.Add(new DataColumn("数量6"typeof(int)));
     80     dt.Columns.Add(new DataColumn("数量7"typeof(int)));
     81     dt.Columns.Add(new DataColumn("数量8"typeof(int)));
     82     dt.Columns.Add(new DataColumn("数量9"typeof(int)));
     83 
     84     Random rdm = new Random();
     85 
     86     for (int i = 10; i <= 80; i++) {
     87         dr = dt.NewRow();
     88         dr[0= "00" + i.ToString();
     89         for (int j = 1; j <= 9; j++) {
     90             dr[j] = rdm.Next(10005000);
     91         }
     92         dt.Rows.Add(dr);
     93     }
     94 
     95     return dt;
     96 }
     97 
     98 /// <summary>
     99 /// 纵滚动条事件
    100 /// </summary>
    101 /// <param name="sender"></param>
    102 /// <param name="e"></param>
    103 /// <remarks></remarks>
    104 private void VScrollBar1_Scroll(object sender, System.Windows.Forms.ScrollEventArgs e)
    105 {
    106     this.DataGridView1.FirstDisplayedScrollingRowIndex = e.NewValue;
    107     //ROW_HEIGHT
    108 
    109 }
    110 
    111 private void Button2_Click(System.Object sender, System.EventArgs e)
    112 {
    113     this.Close();
    114 }
    115 
    116 /// <summary>
    117 /// 合计DataGridView的滚动条事件
    118 /// </summary>
    119 /// <param name="sender"></param>
    120 /// <param name="e"></param>
    121 /// <remarks></remarks>
    122 
    123 private void DataGridViewSum_Scroll(object sender, System.Windows.Forms.ScrollEventArgs e)
    124 {
    125     this.DataGridView1.HorizontalScrollingOffset = e.NewValue;
    126 }
    127 
    128 
    129 /// <summary>
    130 /// 数据变更后重新合计
    131 /// </summary>
    132 /// <param name="sender"></param>
    133 /// <param name="e"></param>
    134 /// <remarks></remarks>
    135 private void DataGridView1_CellValueChanged(object sender, System.Windows.Forms.DataGridViewCellEventArgs e)
    136 {
    137     if (e.ColumnIndex <= 0) {
    138         return;
    139     }
    140     //'DetaGridView中数据变化后重新合计
    141     this.DataGridViewSum(e.ColumnIndex, 0).Value = dt.Compute("Sum(" + dt.Columns(e.ColumnIndex).ColumnName + ")""true");
    142 }
    143 
    144 
    145 /// <summary>
    146 /// 响应鼠标滚轴事件
    147 /// </summary>
    148 /// <param name="sender"></param>
    149 /// <param name="e"></param>
    150 /// <remarks></remarks>
    151 private void DataGridViewSumRow_MouseWheel(object sender, System.Windows.Forms.MouseEventArgs e)
    152 {
    153     if (VScrollBar1.Visible == false) {
    154         return;
    155     }
    156 
    157     if (VScrollBar1.Value - ROW_HEIGHT < 0 & e.Delta > 0) {
    158         VScrollBar1.Value = VScrollBar1.Minimum;
    159         return;
    160     }
    161 
    162     if (VScrollBar1.Value + ROW_HEIGHT > VScrollBar1.Maximum & e.Delta < 0) {
    163         VScrollBar1.Value = VScrollBar1.Maximum;
    164         return;
    165     }
    166 
    167     try {
    168         VScrollBar1.Value -= Convert.ToInt32(e.Delta / Math.Abs(e.Delta) * ROW_HEIGHT);
    169     } catch (Exception ex) {
    170         Debug.WriteLine("###########################");
    171         Debug.WriteLine("VScrollBar1.Value = " + VScrollBar1.Value);
    172         Debug.WriteLine("e.Delta = " + e.Delta);
    173         Debug.WriteLine("###########################");
    174     }
    175     this.DataGridView1.FirstDisplayedScrollingRowIndex = VScrollBar1.Value;
    176     //ROW_HEIGHT
    177 
    178 }
    179 }

    效果如下

  • 相关阅读:
    [tip]build x86+x64 parrelly for your VS solution
    float double的内存表示及比较大小的方法
    [Problem 13]欧拉
    Interface Project
    [复习]内存对齐
    [tip]VS online Gallery in Extention Manager
    [Problem 14]欧拉
    “火柴棍式”程序员面试题打破惯性思维
    [复习]时间复杂度及计算
    ModuleCatalog配置文件
  • 原文地址:https://www.cnblogs.com/ewyb/p/1758941.html
Copyright © 2011-2022 走看看