[C1] 优化 C1FlexGrid 单元格边框

一  优化理由

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

image

其中,明显可以看到如果两个相邻的单元格同时设置了那条相邻的边,则会看起来很粗……原因很简单,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,分别来绘制单元格的上、下、左、右边框及其颜色:

  1 // ** overrides
  2 public override void Apply(Border bdr, SelectedState selState)
  3 {
  4     base.Apply(bdr, SelectedState.None)
  5     ApplyBorder(bdr, _bdrLeft, new Thickness(_bdrThickness.Left, 0, 0, 0))
  6     ApplyBorder(bdr, _bdrTop, new Thickness(0, _bdrThickness.Top, 0, 0))
  7     ApplyBorder(bdr, _bdrRight, new Thickness(0, 0, _bdrThickness.Right, 0))
  8     ApplyBorder(bdr, _bdrBottom, new Thickness(0, 0, 0, _bdrThickness.Bottom))
  9 }
 10 void ApplyBorder(Border bdr, Brush br, Thickness t)
 11 {
 12     if (br != null && t != _thicknessEmpty)
 13     {
 14         // create inner border
 15         var inner = new Border()
 16         inner.BorderThickness = t
 17         inner.BorderBrush = br
 18 
 19         // transfer content
 20         var content = bdr.Child
 21         bdr.Child = inner
 22         inner.Child = content
 23 
 24         // transfer padding
 25         inner.Padding = bdr.Padding
 26         bdr.Padding = _thicknessEmpty
 27     }
 28 }
 29 
ExcelCellStyle

楼主就照这个思路进行优化,每个单元格有一个默认的 Border——bdr,让它负责处理 C1FlexGrid 默认的条条框框显示,即在一中提及的灰色线条;然后再嵌套两层 Border,一个负责右边框,一个负责下边框,理由是为了不让重叠的边框显示成粗线条,令所有单元格都只负责处理其右边框和下边框,并将该单元格的上边框交由它上面那个单元格的下边框负责,该单元格的左边框交由它左侧那个单元格的右边框负责,这样达成一致后,就可以避免相邻单元格中间出现粗线条的现象。

image

三  优化实现

在自定义的 CellStyle 中定义自己的单元格边框设置,如下

private Thickness _bdrThickness;// 单元格边框

然后在自动应用单元格样式的方法 Apply 中实现优化:

  1 /// <summary>
  2 /// 重绘单元格时,嵌套两层Border用来分别显示右边框和下边框
  3 /// </summary>
  4 public override void Apply(Border bdr, SelectedState selState)
  5 {
  6     base.Apply(bdr, selState)
  7     
  8     // 下边框
  9     Border bottom = new Border()
 10     bottom.BorderThickness = new Thickness(0, 0, 0, 1)
 11     bottom.BorderBrush = _bdrThickness.Bottom == 1
 12                         ? new SolidColorBrush(Colors.Black)
 13                         : new SolidColorBrush(Color.FromArgb(0xff, 0xe7, 0xe7, 0xe7))
 14 
 15     // 右边框
 16     Border right = new Border()
 17     right.BorderThickness = new Thickness(0, 0, 1, 0)
 18     right.BorderBrush = _bdrThickness.Right == 1
 19                         ? new SolidColorBrush(Colors.Black)
 20                         : new SolidColorBrush(Color.FromArgb(0xff, 0xe7, 0xe7, 0xe7))
 21 
 22     // 左边框和上边框放在最外面的主边框进行设置
 23     if (_bdrThickness.Left == 1 || _bdrThickness.Top == 1)
 24     {
 25         bdr.BorderBrush = new SolidColorBrush(Colors.Black)
 26         bdr.BorderThickness = new Thickness(_bdrThickness.Left, _bdrThickness.Top, 0, 0)
 27     }
 28     else
 29     {
 30         bdr.BorderThickness = new Thickness(0, 0, 0, 0)
 31     }
 32 
 33     UIElement content = bdr.Child
 34     bdr.Child = bottom
 35     bottom.Child = right
 36     right.Child = content
 37 
 38     right.Padding = bdr.Padding
 39     bottom.Padding = _thicknessEmpty
 40     bdr.Padding = _thicknessEmpty
 41 }
 42 

最后在 C1FlexGrid 的 CellFactory 中应用单元格样式时,就取在 CellStyle 中自己定义的单元格边框 _bdrThickness 值作为 Border 的边框值即可。

当然了,对 C1FlexGrid 的单元格边框优化完成之后,对于在设置单元格边框时是有一条原则的,就是如果设置该单元格的右边框和下边框,那好办,直接设置该单元格的 _bdrThickness 属性即可;但是如果设置该单元的左边框和上边框,就要交给对应的单元格对应的边框进行处理。

好了,最后看一下楼主将优化方案放进 仿Excel扩展C1FlexGrid控件 的效果吧。

image

这套优化方案是根据 Demo 里的启发实现的。

请多指教,谢谢!

转载于:https://www.cnblogs.com/memento/p/4512371.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405832.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php fakepath,在文件上载中获取真实路径而不是“fakepath”

因为我的目标是让最终用户看到上传的文件名,然后通过php mail()函数发送,所以我所做的就是:在JS文件中旧功能:var fileuploadinit function(){$(#career_resume).change(function(){var pathwithfilename $(#career_resume).val();$(.uploadedfile).html("Uploaded File…

Source Insight经典教程

From: http://blog.21ic.com/user1/4251/archives/2008/53650.html Source Insight实质上是一个支持多种开发语言&#xff08;java,c ,c 等等&#xff09;的编辑器&#xff0c;只不过由于其查找、定位、彩色显示等功能的强大&#xff0c;常被我们当成源代码阅读工具使用。 作…

Android 中文 API (29) —— CompoundButton

前言本章内容是android.widget.CompoundButton&#xff0c;翻译来自德罗德&#xff0c;再次感谢德罗德 &#xff01;期待你一起参与Android API 的中文翻译&#xff0c;联系我over140gmail.com。 声明 欢迎转载&#xff0c;但请保留文章原始出处:) 博客园&#xff1a;http://w…

php object oriented,PHP学习记录之面向对象(Object-oriented programming,OOP)基础【接口、抽象类、静态方法等】...

本文实例讲述了PHP面向对象(Object-oriented programming&#xff0c;OOP)基础。分享给大家供大家参考&#xff0c;具体如下&#xff1a;我们可以使用接口(interface)&#xff0c;指定某个类必须实现哪些方法&#xff0c;但不需要定义这些方法的具体内容&#xff0c;我们可以通…

Java虚拟机-内存分配策略

Java技术体系中所提倡的自动内存管理策略最终可以归结为自动化地解决了两个问题&#xff1a;给对象分配内存以及回收分配给对象的内存&#xff1b; 几条普遍的分配规则&#xff1a;1、对象优先在Eden区分配年轻代分为三个区&#xff1a;1个Eden区2个Survivor区。大部分对象在Ed…

Source Insight常用的快捷键

From: http://blog.21ic.com/user1/4251/archives/2008/53650.html Source Insight常用的快捷键&#xff1a; Ctrl :Jump to definition Ctrl/ :Look up reference F3 : search backward F4 : search forward F5: go to Line F7 :Look up symbols F8 :Look up local symbols F…

ubuntu 安装fcitx输入法(3.6和4.0bate)

Ubuntu 10.10默认安装的输入法是ibus&#xff0c;在安装中文语言包&#xff08;http://blog.csdn.net/wangjingfei/archive/2010/05/21/5614203.aspx)之后就可以使用。但是查看了一些网上的资料说是ibus有很多问题&#xff0c;例如会造成Linux QQ崩溃等。不知道是ibus的问题还是…

php在菜单栏里加子菜单,WordPress后台添加子菜单add_submenu_page()

接上文&#xff1a;WordPress后台添加顶级菜单add_menu_page()&#xff0c;今儿再分享一下在 wordpress 后台侧边栏添加子菜单的方法&#xff0c;用到的函数是&#xff1a;add_submenu_page()函数用法&#xff1a;add_submenu_page( $parent_slug, $page_title, $menu_title, $…

C#String详解

字符串&#xff1a;stringLength - 字符串的长度。 TrimStart() 压缩空格即消除字符串开始空格TrimEnd() 消除结尾空格Trim() 同时消除开头和结尾空格。注&#xff1a;中间空格不消除&#xff0c;因为英文单词之间用空格隔开。 ToUpper() 全部变大写ToLower() 全部变小写 Repl…

linux modprobe命令参数及用法详解--linux加载模块命令

From: http://www.linuxso.com/command/modprobe.html modprobe(module probe) 功能说明&#xff1a;自动处理可载入模块。 语  法&#xff1a;modprobe [-acdlrtvV][--help][模块文件][符号名称 符号值] 补充说明&#xff1a;modprobe可载入指定的个别模块&#xff0c;…

fedora下安装pps

fedora下安装pps成功&#xff0c;官方下载的deb包解压&#xff0c;然后手动安装。大致讲一下方法&#xff0c;如下&#xff1a;到官方下载deb包&#xff0c;右键解压后&#xff0c;进入解压的文件夹&#xff0c;将两个tar包解压&#xff0c;得到etc,opt,usr,三个文件夹&#xf…

ThinkPHP整合百度Ueditor图文教程

ThinkPHP整合百度Ueditor图文教程 ThinkPHP整合百度Ueditor&#xff0c;基于黄永成老师的视频说明的申明&#xff1a;最好大家都能写绝对路径的都写好绝对路径比如&#xff1a;window.UEDITOR_HOME_URL 他在教程里面已经说了的&#xff0c;我就不再次说了啊&#xff0c;就一笔…

php 支付加密,关于支付时rsa加密解密的函数

//加密function _checkPadding($padding, $type) {if ($type en) {switch ($padding) {case OPENSSL_PKCS1_PADDING :$ret true;break;default :$ret false;}} else {switch ($padding) {case OPENSSL_PKCS1_PADDING :case OPENSSL_NO_PADDING :$ret true;break;default :$…

电脑延迟关机命令Shutdown详解

From: http://www.ccw.com.cn/college/soft/b2c/os/htm2010/20101208_904968.shtml 目前实现自动关机的方法主要是使用第三方软件,比较麻烦!其实,Windows自身就具备自动关机功能,它是由系统内部的 "Shutdown.exe"升序来控制的,位于"C:/windows/System32"文…

树莓派Raspberry 操作GPIO--LED

一、 安装 wiringPi &#xff1a; sudo apt-get install wiringPi 二、查看安装版本 三、查看端口 四、创建源文件 touch myled.c 五、编写源代码 vi myled.c 使用cat myled.c 查看 六、编译和链接wiringPi库 七、运行

SQL逗号分隔的字段统计(摘自网络)

前言&#xff1a;由于很多业务表因为历史原因或者性能原因&#xff0c;都使用了违反第一范式的设计模式。即同一个列中存储了多个属性值&#xff08;具体结构见下表&#xff09;。这种模式下&#xff0c;应用常常需要将这个列依据分隔符进行分割&#xff0c;并得到列转行的结果…