找回密码
 立即注册

QQ登录

只需一步,快速开始

村东智叟
初级会员   /  发表于:2022-2-7 10:38  /   查看:1926  /  回复:7
1金币
   您好: 我想请教一下关于 用C1FlexGrid做的日期控件的选择后的背景的问题

我想实现的效果是下图的效果
跨月选择的时候,会将前一个月份的所有日期都选中(需求1)


实际实装后的效果是,如下的效果(NG)


点击月份的单元格时,会自动将那一行都选中,但是不存在的日期的单元格背景不会变色,点击也不会发生点击事件(需求2)



实际实装后的效果是,如下的效果(NG)


请问如何实现我想要的需求的效果






附件: 您需要 登录 才可以下载或查看,没有帐号?立即注册

最佳答案

查看完整内容

通过c1FlexGrid4.Styles.Add添加一个样式然后设置给这些单元格即可,要清除的时候,Remove这个样式就行,参考下面的代码 当然,你可以自己加个bool类型的变量判断,是否是选择区域的操作,,我这里的代码仅供参考

7 个回复

倒序浏览
最佳答案
最佳答案
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-2-7 10:38:33
来自 4#
通过c1FlexGrid4.Styles.Add添加一个样式然后设置给这些单元格即可,要清除的时候,Remove这个样式就行,参考下面的代码
当然,你可以自己加个bool类型的变量判断,是否是选择区域的操作,,我这里的代码仅供参考


  1. private void C1FlexGrid4_MouseClick(object sender, MouseEventArgs e)
  2.         {
  3.             var hitinfo = c1FlexGrid4.HitTest();
  4.             if (hitinfo.Type== HitTestTypeEnum.Cell)
  5.             {
  6.                 if(c1FlexGrid4.Tag==null)
  7.                 {
  8.                     c1FlexGrid4.Tag = new Point(hitinfo.Column, hitinfo.Row) ;
  9.                     if(c1FlexGrid4.Styles["SelectStyle"]!=null)
  10.                         c1FlexGrid4.Styles.Remove("SelectStyle");
  11.                 }
  12.                 else
  13.                 {
  14.                     c1FlexGrid4.Styles.Add("SelectStyle");
  15.                     c1FlexGrid4.Styles["SelectStyle"].BackColor= Color.LightSeaGreen;
  16.                     Point point1 = (Point)c1FlexGrid4.Tag;
  17.                     for (int row = point1.Y + 1; row < hitinfo.Row; row++)
  18.                     {
  19.                         c1FlexGrid4.Rows[row].Style= c1FlexGrid4.Styles["SelectStyle"];
  20.                     }
  21.                     var toprowrange = c1FlexGrid4.GetCellRange(point1.Y, point1.X, point1.Y, c1FlexGrid4.Cols.Count-1);
  22.                     toprowrange.Style= c1FlexGrid4.Styles["SelectStyle"];
  23.                     var bottomrange = c1FlexGrid4.GetCellRange(hitinfo.Row, 0, hitinfo.Row, hitinfo.Column);
  24.                     bottomrange.Style = c1FlexGrid4.Styles["SelectStyle"];
  25.                     c1FlexGrid4.Tag = null;
  26.                 }

  27.             }
  28.         }
复制代码
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-2-7 12:00:18
2#
首先,C1FlexGrid只能支持行,列,单元格,或者单元格区域选择(也就是你图上的矩形区域)
没有办法去选择若干个不规则的单元格

如果要实现你这边背景色改变的效果,只能只对单个单元格进行背景色设置,比如先点击一个单元格作为开始日期,在点击一个单元格作为结束日期,然后设置其间的单元格背景色
回复 使用道具 举报
村东智叟
初级会员   /  发表于:2022-2-7 12:17:16
3#
Richard.Ma 发表于 2022-2-7 12:00
首先,C1FlexGrid只能支持行,列,单元格,或者单元格区域选择(也就是你图上的矩形区域)
没有办法去选择 ...

您说的这个方案,我也尝试过。
但是有很多问题。
因为选择日期的时候是动态的给与背景的,涉及到跨行的背景的动态改变。和选择再次选择的时候的背景的变化。
比如设置的背景后,再次选择其他的单元格时,之前设置背景的单元格还是有背景色。
并不像原始的那样
回复 使用道具 举报
村东智叟
初级会员   /  发表于:2022-2-7 14:05:12
5#
Richard.Ma 发表于 2022-2-7 13:50
通过c1FlexGrid4.Styles.Add添加一个样式然后设置给这些单元格即可,要清除的时候,Remove这个样式就行,参 ...

实际上的困难是,涉及很多事件。
比如我的鼠标的左键一直是押下的状态,鼠标在日期网格里面移动的话,网格的背景是会实时的改变的,就会涉及的mouseEnter和mouseLeave事件。
日期选定后,这些网格又要保持背景色不变。涉及mouseUp的事件
在以上的状态下,我在次选择某一个单元格,就会涉及到之前的网格的背景的清除和点击的网格的背景的设置。又涉及到mouseDown和mouseClick等等。
实际上实装的时候,有各种问题

回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-2-7 15:18:53
6#
嗯,这个确实没有其他的办法了,

由于控件本身原生不支持此功能,只能是通过二次开发进行一些修改,你说的这些确实涉及的修改很多,即使全部实现,可能还会有其他的问题
回复 使用道具 举报
村东智叟
初级会员   /  发表于:2022-2-8 11:29:32
7#
Richard.Ma 发表于 2022-2-7 15:18
嗯,这个确实没有其他的办法了,

由于控件本身原生不支持此功能,只能是通过二次开发进行一些修改,你说 ...

好的,了解了,我在想想其他的办法吧,麻烦关一下贴子。谢谢
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2022-2-8 11:34:19
8#
好的,有其他问题欢迎发新帖咨询
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部