找回密码
 立即注册

QQ登录

只需一步,快速开始

ud7070

初级会员

23

主题

97

帖子

312

积分

初级会员

积分
312

微信认证勋章

ud7070
初级会员   /  发表于:2019-6-13 16:40  /   查看:3974  /  回复:7
在C1FlexGrid里设置了某列的了背景颜色(不同行不同颜色),当行被选中时,选中行的该列对应的单元格背景颜色被选中状态覆盖,请问在选择中行时,如何能不被选中行影响依然显示该单元格的背景颜色?
看了wpf 的也有类似问题,但不知道 winform如何处理,如何重写 ApplyCellStyles

7 个回复

倒序浏览
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2019-6-13 23:26:15
沙发
如下代码即可实现第2列为Pink时不受选中行影响,主要是用OwnerDrawCell 事件实现单元格样式的自定义


  1.         private void Themes_Load(object sender, EventArgs e)
  2.         {
  3. c1FlexGrid1.Styles.Add("myCustom4");
  4.             c1FlexGrid1.Styles["myCustom4"].BackColor = Color.Pink;

  5. c1FlexGrid1.DrawMode = DrawModeEnum.OwnerDraw;
  6. this.c1FlexGrid1.OwnerDrawCell += new C1.Win.C1FlexGrid.OwnerDrawCellEventHandler(this.c1FlexGrid1_OwnerDrawCell);
  7. }



  8. private void c1FlexGrid1_OwnerDrawCell(object sender, OwnerDrawCellEventArgs e)
  9.         {
  10.             if (e.Col == 1)
  11.             {
  12.                 e.Style = c1FlexGrid1.Styles["myCustom4"];
  13.             }
  14. }
复制代码
回复 使用道具 举报
ud7070
初级会员   /  发表于:2019-6-14 11:42:59
板凳
本帖最后由 ud7070 于 2019-6-15 17:23 编辑
Richard.Ma 发表于 2019-6-13 23:26
如下代码即可实现第2列为Pink时不受选中行影响,主要是用OwnerDrawCell 事件实现单元格样式的自定义

您好,感谢回复。
我的意思是比如5行3列的表格,第二列是有背景颜色列,每行颜色不同,如何能在选中行时不覆盖第二列的背景颜色

上图是初始正常状态



上图是选中行后的状态,可以看到 Color列的背景色被选中状态覆盖。当然取消选中行状态后,Color单元格背景色显示正常。

本帖子中包含更多资源

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

x
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2019-6-14 16:43:44
地板
我明白你的意思,如果要设置某一列的每一行都不一样颜色的话,也是在这里设置,这样不会受到选择行的影响

你可以参考这个演示程序里面的代码,你需要的功能在“动态样式”演示窗口,可以看到选择一行以后,颜色列没有受到影响

https://gcdn.grapecity.com.cn/fo ... &extra=page%3D1



本帖子中包含更多资源

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

x
回复 使用道具 举报
ud7070
初级会员   /  发表于:2019-6-15 08:55:56
5#
本帖最后由 ud7070 于 2019-6-15 17:38 编辑
Richard.Ma 发表于 2019-6-14 16:43
我明白你的意思,如果要设置某一列的每一行都不一样颜色的话,也是在这里设置,这样不会受到选择行的影响
...

DEMO中也是选中行后,有背景颜色的单元格也成了没颜色的了。




本帖子中包含更多资源

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

x
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2019-6-15 14:41:15
6#
你发过来的图片我看不到,这个是我修改后的这个页面的源码,你替换下试试

  1. private void Themes_Load(object sender, EventArgs e)
  2.         {
  3.             // TODO: This line of code loads data into the 'c1DemoDataSet.Products' table. You can move, or remove it, as needed.
  4.             this.productsTableAdapter.Fill(this.c1DemoDataSet.Products);
  5.             
  6.             // initialize themes
  7.             c1FlexGrid1.DrawMode = DrawModeEnum.OwnerDraw;

  8.             c1FlexGrid1.Styles.Add("myCustom1");
  9.             c1FlexGrid1.Styles["myCustom1"].BackColor = Color.Red;
  10.             c1FlexGrid1.Styles["myCustom1"].Font = new Font(c1FlexGrid1.Styles.Normal.Font.Name, 11);

  11.             c1FlexGrid1.Styles.Add("myCustom2");
  12.             c1FlexGrid1.Styles["myCustom2"].BackColor = Color.Orange;
  13.             c1FlexGrid1.Styles["myCustom2"].Font = new Font(c1FlexGrid1.Styles.Normal.Font.Name, 10);

  14.             c1FlexGrid1.Styles.Add("myCustom3");
  15.             c1FlexGrid1.Styles["myCustom3"].BackColor = Color.Yellow;
  16.             c1FlexGrid1.Styles["myCustom3"].Font = new Font(c1FlexGrid1.Styles.Normal.Font.Name, 9);
  17.             c1FlexGrid1.Styles.Add("myCustom4");
  18.             c1FlexGrid1.Styles["myCustom4"].BackColor = Color.Pink;

  19.             c1FlexGrid1.AutoSizeCols();
  20.             c1FlexGrid1.VisualStyle = C1.Win.C1FlexGrid.VisualStyle.Office2007Blue;
  21.             this.BackColor = Color.FromArgb(191, 219, 255);

  22.             



  23.         }

  24.         private void c1FlexGrid1_OwnerDrawCell(object sender, OwnerDrawCellEventArgs e)
  25.         {
  26.             if (e.Col == 1)
  27.             {
  28.                 e.Style = c1FlexGrid1.Styles["myCustom4"];
  29.             }
  30.             if (c1FlexGrid1.Cols[e.Col].Name == "UnitsInStock" && e.Row > 0)
  31.             {
  32.                 int tmp;
  33.                 tmp = int.Parse(c1FlexGrid1[e.Row, e.Col].ToString());
  34.                 if (tmp < 10)
  35.                 {
  36.                     e.Style = c1FlexGrid1.Styles["myCustom1"];
  37.                 }
  38.                 else if (tmp < 50)
  39.                 {
  40.                     e.Style = c1FlexGrid1.Styles["myCustom2"];
  41.                 }
  42.                 else if (tmp < 100)
  43.                 {
  44.                     e.Style = c1FlexGrid1.Styles["myCustom3"];
  45.                 }
  46.             }
  47.         }
复制代码
回复 使用道具 举报
ud7070
初级会员   /  发表于:2019-6-15 17:43:37
7#
Richard.Ma 发表于 2019-6-15 14:41
你发过来的图片我看不到,这个是我修改后的这个页面的源码,你替换下试试

谢谢您的耐心解答,图片我又传了一遍应该可以看到了。但我的表格行数据是动态生成,随时变化的,而且用您的代码中  OwnerDrawCell 事件,在我选择行 CheckBox改变行选中状态(flg.Rows[e.Row].Selected = true)后,没有触发 OwnerDrawCell 事件

  1. private void c1FlexGrid_Legend_CellChecked(object sender, C1.Win.C1FlexGrid.RowColEventArgs e)
  2.         {
  3.             var flg = c1FlexGrid_Legend;
  4.             bool isChecked = (flg.GetCellCheck(e.Row, e.Col) == C1.Win.C1FlexGrid.CheckEnum.Checked);
  5.             if (e.Col == 0)//选择
  6.             {
  7.                 if (e.Row == 0)//全选/全不选
  8.                 {
  9.                     for (int r = 1; r < flg.Rows.Count; r++)
  10.                     {
  11.                         flg.SetCellCheck(r, 0, (isChecked ? C1.Win.C1FlexGrid.CheckEnum.Checked : C1.Win.C1FlexGrid.CheckEnum.Unchecked));
  12.                         flg.Rows[r].Selected = isChecked;
  13.                     }
  14.                 }
  15.                 else
  16.                 {
  17.                     flg.Rows[e.Row].Selected = isChecked;
  18.                     checkSelectAll(c1FlexGrid_Legend);
  19.                 }
  20.             }
  21.         }
复制代码
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2019-6-17 11:42:09
8#
建议您还是将源码打包上传上来吧,然后我帮你验证
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部