[C1] 优化 C1FlexGrid 单元格边框
一 优化理由
如下图所示,如果按照 C1FlexGrid 自带的单元格边框设置,即对每个单元格的 CellStyle 的 BorderThickness 进行设置,会得到如下图的效果:

其中,明显可以看到如果两个相邻的单元格同时设置了那条相邻的边,则会看起来很粗……原因很简单,C1FlexGrid是在 Grid 的基础上扩展,并且对每个单元格的绘制都是通过嵌套一层 Border 处理的,然后楼主就闲着 dt 自己用 Grid 模拟了一个简单的 C1FlexGrid 表格,然后用 Border 嵌套放入,设置了一下 Border 的边框,效果一模一样啊,重叠部分都变粗了;还有一个问题就是,C1FlexGrid 可以设置 GridLinesBrush 属性,来显示默认的条条框框的显示(即时未设置单元格边框),如图中的灰色线条。但是问题来了,如图中(1,0,0,0)单元格设置,右侧和下方的默认线条没了,偶虽然不想要该单元格右边框和下边框,但你也不能把默认的条条框框的线条给弄没了啊……
这对于处女座的楼主来说,简直是不可容忍的缺陷啊,于是楼主就参照 C1FlexGrid 的 Demo 工程 ExcelBook 5.0 做了自己的优化处理,并将该优化应用到一直在持续完善的 仿Excel扩展C1FlexGrid控件 中去。
二 优化思路
在 Demo——ExcelBook 5.0 中有如下一段代码,可以看出来,它们在每个单元格的内容外围嵌套了四层 Border,分别来绘制单元格的上、下、左、右边框及其颜色:
// ** overrides
public override void Apply(Border bdr, SelectedState selState)
{
base.Apply(bdr, SelectedState.None)
ApplyBorder(bdr, _bdrLeft, new Thickness(_bdrThickness.Left, 0, 0, 0))
ApplyBorder(bdr, _bdrTop, new Thickness(0, _bdrThickness.Top, 0, 0))
ApplyBorder(bdr, _bdrRight, new Thickness(0, 0, _bdrThickness.Right, 0))
ApplyBorder(bdr, _bdrBottom, new Thickness(0, 0, 0, _bdrThickness.Bottom))
}
void ApplyBorder(Border bdr, Brush br, Thickness t)
{
if (br != null && t != _thicknessEmpty)
{
// create inner border
var inner = new Border()
inner.BorderThickness = t
inner.BorderBrush = br // transfer content
var content = bdr.Child
bdr.Child = inner
inner.Child = content // transfer padding
inner.Padding = bdr.Padding
bdr.Padding = _thicknessEmpty
}
}
ExcelCellStyle
楼主就照这个思路进行优化,每个单元格有一个默认的 Border——bdr,让它负责处理 C1FlexGrid 默认的条条框框显示,即在一中提及的灰色线条;然后再嵌套两层 Border,一个负责右边框,一个负责下边框,理由是为了不让重叠的边框显示成粗线条,令所有单元格都只负责处理其右边框和下边框,并将该单元格的上边框交由它上面那个单元格的下边框负责,该单元格的左边框交由它左侧那个单元格的右边框负责,这样达成一致后,就可以避免相邻单元格中间出现粗线条的现象。

三 优化实现
在自定义的 CellStyle 中定义自己的单元格边框设置,如下
private Thickness _bdrThickness;// 单元格边框
然后在自动应用单元格样式的方法 Apply 中实现优化:
/// <summary>
/// 重绘单元格时,嵌套两层Border用来分别显示右边框和下边框
/// </summary>
public override void Apply(Border bdr, SelectedState selState)
{
base.Apply(bdr, selState) // 下边框
Border bottom = new Border()
bottom.BorderThickness = new Thickness(0, 0, 0, 1)
bottom.BorderBrush = _bdrThickness.Bottom == 1
? new SolidColorBrush(Colors.Black)
: new SolidColorBrush(Color.FromArgb(0xff, 0xe7, 0xe7, 0xe7)) // 右边框
Border right = new Border()
right.BorderThickness = new Thickness(0, 0, 1, 0)
right.BorderBrush = _bdrThickness.Right == 1
? new SolidColorBrush(Colors.Black)
: new SolidColorBrush(Color.FromArgb(0xff, 0xe7, 0xe7, 0xe7)) // 左边框和上边框放在最外面的主边框进行设置
if (_bdrThickness.Left == 1 || _bdrThickness.Top == 1)
{
bdr.BorderBrush = new SolidColorBrush(Colors.Black)
bdr.BorderThickness = new Thickness(_bdrThickness.Left, _bdrThickness.Top, 0, 0)
}
else
{
bdr.BorderThickness = new Thickness(0, 0, 0, 0)
} UIElement content = bdr.Child
bdr.Child = bottom
bottom.Child = right
right.Child = content right.Padding = bdr.Padding
bottom.Padding = _thicknessEmpty
bdr.Padding = _thicknessEmpty
}
最后在 C1FlexGrid 的 CellFactory 中应用单元格样式时,就取在 CellStyle 中自己定义的单元格边框 _bdrThickness 值作为 Border 的边框值即可。
当然了,对 C1FlexGrid 的单元格边框优化完成之后,对于在设置单元格边框时是有一条原则的,就是如果设置该单元格的右边框和下边框,那好办,直接设置该单元格的 _bdrThickness 属性即可;但是如果设置该单元的左边框和上边框,就要交给对应的单元格对应的边框进行处理。
好了,最后看一下楼主将优化方案放进 仿Excel扩展C1FlexGrid控件 的效果吧。

这套优化方案是根据 Demo 里的启发实现的。
请多指教,谢谢!
[C1] 优化 C1FlexGrid 单元格边框的更多相关文章
- C# 对Excel 单元格格式, 及行高、 列宽、 单元格边框线、 冻结设置
一.对行高,列宽.单元格边框等的设置 这篇简短的文字对单元格的操作总结的比较全面,特此转载过来. private _Workbook _workBook = null; private Workshe ...
- C# Excel行高、列宽、合并单元格、单元格边框线、冻结
private _Workbook _workBook = null;private Worksheet _workSheet = null;private Excel.Application _ex ...
- Excel VBA入门(八)单元格边框
本文基于以下文件 http://pan.baidu.com/s/1nvJtsu9 (部分)内容预览: 1. 边框样式 Sub cell_format() Dim sht As Worksheet Di ...
- C#操作EXCEL常见操作集合(行高,列宽,合并单元格,单元格边框线)
private _Workbook _workBook = null; private Worksheet _workSheet = null; private Excel.Application _ ...
- poi excel设置合并单元格边框格式
版本3.17 //设置合并单元格的边框 public static void setBorderForMergeCell(BorderStyle style,int color, CellRangeA ...
- table 鼠标移上去改变单元格边框颜色。
表格定义了border-collapse:collapse;边框会合并为一个单一的边框.会忽略 border-spacing 和 empty-cells 属性. 用td:hover,显示不全
- c# Excel 行高、列宽、合并单元格、单元格边框线、冻结
http://www.2cto.com/kf/201007/52724.html 新增选择整列: Range = ((Range)(WALeTieSheet.Cells[1, PwCStartCol_ ...
- DataGridView 的单元格的边框、 网格线样式的设定【转】
1) DataGridView 的边框线样式的设定DataGridView 的边框线的样式是通过 DataGridView.BorderStyle 属性来设定的. BorderStyle 属性设定值是 ...
- 修复Java使用POI合并Excel单元格后,边框不显示的问题
使用Apache POI生成Excel文档时,当进行单元格合并操作后,被合并的单元格边框会消失,使用如下方式可以解决. 创建方法: public void setBorderStyle(int bor ...
随机推荐
- iOS 键盘添加完成按钮,delegate和block回调
这个是一个比较初级一点的文章,新人可以看看.当然实现这个需求的时候自己也有一点收获,记下来吧. 前两天产品要求在工程的所有数字键盘弹出时,上面带一个小帽子,上面安装一个“完成”按钮,这个完成按钮也没有 ...
- 使用python自动生成docker nginx反向代理配置
由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...
- Android游戏开发实践(1)之NDK与JNI开发03
Android游戏开发实践(1)之NDK与JNI开发03 前面已经分享了两篇有关Android平台NDK与JNI开发相关的内容.以下列举前面两篇的链接地址,感兴趣的可以再回顾下.那么,这篇继续这个小专 ...
- i++、++i 、i--、--i
总结: i++ 先用后加, ++i先加后用: i--先用后减, --i先减后用: //int i = 1; //Console.WriteLine(i);//1 //Console.WriteLine ...
- 安装devtoolset
在运维的工作内,经常要编译安装各种开源组件,以CentOS 6的用户来说,大部分时候用到gcc的时候都是4.4.7版本的,在绝大多数情况下编译一些东西还是够用的,但还是有个别软件对gcc的版本是有要求 ...
- Spring MVC入门
1.什么是SpringMvc Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 M ...
- 使用 GCC 和 GNU Binutils 编写能在 x86 实模式运行的 16 位代码
不可否认,这次的标题有点长.之所以把标题写得这么详细,主要是为了搜索引擎能够准确地把确实需要了解 GCC 生成 16 位实模式代码方法的朋友带到我的博客.先说一下背景,编写能在 x86 实模式下运行的 ...
- 【初探Spring】------Spring IOC(一)
IOC:Inversion of Control(控制反转).IOC它所体现的并不是一种技术,而是一种思想,一种将设计好的对象交给容器来管理的思想.IOC的核心思想就体现在控制.反转这两个词上面,要理 ...
- CocoaPods被卡住:Updating local specs repositories
使用CocoaPods被卡住:Updating local specs repositories 使用 pod install --verbose --no-repo-update
- 无需编译、快速生成 Vue 风格的文档网站
无需编译.快速生成 Vue 风格的文档网站 https://docsify.js.org/#/#coverpage https://github.com/QingWei-Li/docsify/