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 }

效果如下

原文地址:https://www.cnblogs.com/ewyb/p/1758941.html