在DataGridView控件中实现冻结列分界线
我们在使用Office Excel的时候,有很多时候需要冻结行或者列。这时,Excel会在冻结的行列和非冻结的区域之间绘制上一条明显的黑线。如下图:

(图1)
WinForm下的DataGridView控件也能实现类似的冻结行或者列的功能(参见:http://msdn.microsoft.com/zh-cn/library/28e9w2e1(VS.85).aspx) ,但是呢,DataGridView控件默认不会在冻结列或者行的分界处绘制一个明显的分界线,这样的话,最终用户很难注意到当前有列或者行是冻结的。如下图所示:你能很快的找到那一列是Freeze的么?

(图2)
正是因为如此,我们如果能做出类似Excel的效果,就可以大大提高数据的可读性。
通常,我们如果想在现有的控件上多画点什么,就会去Override OnPaint方法,然后加入自己的OwnerDraw逻辑,但是呢在DataGridView上有一些困难:
1.如何确定冻结分界线的位置
2.如何保证分界线不会绘制到ScrollBar上
研究了一下,我们可以借用DataGridView提供的CellPainting方法。在DataGridView绘制每一个Cell的时候判断当前Cell是否是分界线所在的位置,然后进行绘制。最终做出的效果如下图:

(图3)
以下是DataGridView控件扩展源代码:
public class DataGridViewEx : DataGridView{ protected override void OnCellPainting(DataGridViewCellPaintingEventArgs e) { base.OnCellPainting(e); // // Paints the Frozen line // int lastFreezeColumnIndex = GetDisplayColumnFrozenLineIndex(); int lastFreezeRowIndex = GetDisplayRowFrozenLineIndex(); bool drawRowLine = lastFreezeRowIndex != -1 && lastFreezeRowIndex == e.RowIndex; bool drawColumLine = lastFreezeColumnIndex != -1 && lastFreezeColumnIndex == e.ColumnIndex; if (drawRowLine || drawColumLine) { e.Paint(e.ClipBounds, e.PaintParts); if (drawColumLine) { e.Graphics.DrawLine(Pens.Black, e.CellBounds.Right - 1, e.CellBounds.Top, e.CellBounds.Right - 1, this.ClientRectangle.Bottom); } if (drawRowLine) { e.Graphics.DrawLine(Pens.Black, e.CellBounds.Left, e.CellBounds.Bottom - 1, e.CellBounds.Right, e.CellBounds.Bottom - 1); } e.Handled = true; } } private int GetDisplayColumnFrozenLineIndex() { int lastFreezeColumnIndex = -1; for (int i = 0; i < this.ColumnCount; i++) { DataGridViewColumn column = this.Columns[i]; if (column.Visible && column.Frozen) { lastFreezeColumnIndex = i; } else if (!column.Frozen) { return lastFreezeColumnIndex; } } return lastFreezeColumnIndex; } private int GetDisplayRowFrozenLineIndex() { int lastFreezeRowIndex = -1; for (int i = 0; i < this.RowCount; i++) { DataGridViewRow row = this.Rows[i]; if (row.Visible && row.Frozen) { lastFreezeRowIndex = i; } else if (!row.Frozen) { return lastFreezeRowIndex; } } return lastFreezeRowIndex; }} |
在DataGridView控件中实现冻结列分界线的更多相关文章
- 实现DataGridView控件中CheckBox列的使用
最近做WindowsForms程序,使用DataGridView控件时,加了一列做选择用,发现CheckBox不能选中.搜索后,要实现DataGridView的CellContentClick事件,将 ...
- 在DataGridView控件中加入ComboBox下拉列表框的实现
在DataGridView控件中加入ComboBox下拉列表框的实现 转自:http://www.cnblogs.com/luqingfei/archive/2007/03/28/691372.htm ...
- 在DataGridView控件中验证数据输入
实现效果: 知识运用: DataGridView控件的公共事件CellValidating //将System.Windows.Forms.DataGridViewCellValidatingEven ...
- DataGridView控件中添加ComboBox下拉列表框的实现
//ComboBox控件拖放到DataGridView控件的某个位置 //添加年龄下拉框 private void BindAge() { //我这里添加的是静态数据,一般都是从数据库读出来的,这里就 ...
- 在DataGridView控件中显示图片
实现效果: 知识运用: DataGridView控件的DataSource属性 实现代码: private void Form1_Load(object sender, EventArgs e) { ...
- 禁止DataGridView控件中添加和删除行
实现效果: 知识运用: DataGridView控件的AllowUserToAddRows AllowUserDeleteRows和ReadOnly属性 实现代码: private void btn_ ...
- 在DataGridView控件中启用换行
实现效果: 知识运用: DataGridView控件公共属性DefaultCellStyle的WrapMode属性 public DataGridViewTriState WrapMode { ge ...
- 设置DataGridView控件中字体的样式
实现效果: 知识运用: DataGridView控件的公共属性DefaultCellStyle的Font属性 public Font Font {get;set;} //获取或设置应用与DataGr ...
- 如何在winform DataGridView控件的DataGridViewButtonColumn按钮列中禁用按钮
原文:http://msdn.microsoft.com/en-us/library/ms171619(v=vs.85).ASPX public class DataGridViewDisableBu ...
随机推荐
- NYOJ 745 首尾相连数组的最大子数组和
首尾相连数组的最大子数组和 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给定一个由N个整数元素组成的数组arr,数组中有正数也有负数,这个数组不是一般的数组,其首 ...
- Leetcode 391.完美矩形
完美矩形 我们有 N 个与坐标轴对齐的矩形, 其中 N > 0, 判断它们是否能精确地覆盖一个矩形区域. 每个矩形用左下角的点和右上角的点的坐标来表示.例如, 一个单位正方形可以表示为 [1,1 ...
- TOJ 假题之 Cow Brainiacs
1570: Cow Brainiacs Time Limit(Common/Java):1000MS/10000MS Memory Limit:65536KByteTotal Submit: ...
- HDU——3786找出直系亲属(DFS+回溯)
找出直系亲属 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- 算法复习——splay(bzoj3224)
题目: Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个 ...
- hdu 2859
#include<stdio.h> char s[1010][1010]; int map[1010][1010]; int main() { int n,i,j,k,ii,jj; w ...
- cf725F Family Photos
Alice and Bonnie are sisters, but they don't like each other very much. So when some old family phot ...
- ngrinder的安装
1.官网下载war包(ngrinder-controller),可以使用tomcat启动或者直接nohup java -XX:Permsize=200m -jar ngrinder-3.4.1.war ...
- 洛谷 [P2734] 游戏
博弈论+区间dp 有博弈论吗?大约只有一个博弈论的壳子 设 dp[i][j] 表示区间 i ~ j 先手最多能取多少, 它可以由 i ~ j - 1 与 i + 1 ~ j 来转移, 等于上述两个区间 ...
- NOJ1203 最多约数问题 [搜索 数论]
传送门 njczy2010 1203 Accepted 79MS 1400K 2321Byte G++ 2015-01-25 13:14:25.0 最多约数问题 时间限制(普通/Java) : 2 ...