DataGridView冻结底部的合计行
1. 数据部分的DataGridView,不带任何滚动框
2.合计部分的DataGridView,带有横向滚动框
3.在画面上添加一个纵向滚动框
实现的主要思路就是用合计行的横向滚动框控制两个DataGridView的横向滚动,右侧的纵向滚动狂控制数据部分的DataGridView,效果看起来就是合计行始终显示。
该例实现了合计行的自动计算,取数据的部分是用程序做的DataTable
DataGridViewSumRow类
代码
2.合计部分的DataGridView,带有横向滚动框
3.在画面上添加一个纵向滚动框
实现的主要思路就是用合计行的横向滚动框控制两个DataGridView的横向滚动,右侧的纵向滚动狂控制数据部分的DataGridView,效果看起来就是合计行始终显示。
该例实现了合计行的自动计算,取数据的部分是用程序做的DataTable
DataGridViewSumRow类
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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(1000, 5000);
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 }
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(1000, 5000);
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 }
效果如下