找回密码
 立即注册

QQ登录

只需一步,快速开始

yin_tb

高级会员

53

主题

198

帖子

1003

积分

高级会员

积分
1003

微信认证勋章

yin_tb
高级会员   /  发表于:2021-3-11 15:05  /   查看:8325  /  回复:20
1金币
如题,C1文档中说,如果TrueDBgrid要冻结单元格,首先将列的FetchStyle设为True. 然后在事件FetchCellStyle中,e.CellStyle.Locked=True.
以上我能明白,也测试可以。但我发现,e.CellStyle.Locked=True. 会让该行所有FetchStyle设为True的该行单元格全冻结了呀。
现实是,如果我开发的ERP系统,需要在表单中录入存货,存货管理的属生不同,比如,有的同时管理颜色和尺码,有的只管颜色,有的只管尺码,有的什么也不管理,不管理代表不是必输,管理代表必输。
网格中有以下列, 存货编码  名称   数量  单价   金额   颜色    尺码 ,我将颜色和尺码列的FetchStyle设为True,我需要在录入过程中,根据录入的存货来区分,如果全管理时,不冻结颜色和尺码,如果只管颜色,那就冻结尺码单元格,如果只管尺码,就冻结颜色单元格,请问,这种情况支持吗?我知道微软自带的datagridview可以,难道C1TrueDBgrid还不如它?

20 个回复

正序浏览
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-3-12 18:11:42
21#
不客气
回复 使用道具 举报
yin_tb
高级会员   /  发表于:2021-3-12 18:04:18
20#
另外,我把管理标志列的datafield全改名为ifree1, 2,3这种名,输入的列表列用free1,2,3这种,然后在FetchCellStyle事件中,用列名的Contains来比对,再组合列名字符串,很短的语句,实现了就算有100种属性,也很好,应该性能也很快。感谢马老师,要不是你说用名字不行,用e.col可以,我也想不到去debug.print,结果一看,出来的名全是中文,我一下恍然大悟,感谢。终于这次不是C1的BUG。不然,我真要崩溃了,哈哈哈,爽爽爽。
回复 使用道具 举报
yin_tb
高级会员   /  发表于:2021-3-12 17:57:15
19#
感谢马老师,那么辛苦,一直在帮我找办法,感谢!!!!!!!!!!!,看来以后在用C1组件时,一定要天马行空,不能用常规思想
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-3-12 17:55:09
18#
,是这个原因,问题解决了就行
回复 使用道具 举报
yin_tb
高级会员   /  发表于:2021-3-12 15:21:14
16#
Richard.Ma 发表于 2021-3-12 10:22
电话和你沟通确实,你是要判断某一列的值是否符合逻辑, 以此控制另外的列是否解锁,可以参考以下代码


...

马老师,请看附件DEMO

本帖子中包含更多资源

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

x
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-3-12 10:22:40
15#
电话和你沟通确实,你是要判断某一列的值是否符合逻辑, 以此控制另外的列是否解锁,可以参考以下代码

  1.             //锁定所有单元格
  2.             c1TrueDBGrid1.Splits[0].Style.Locked = true;
  3.             c1TrueDBGrid1.FetchCellStyle += (s, e) =>
  4.             {
  5.                
  6.                 //需要用第4列的标志条件,控制第5列和第六列,且条件相同,如果条件不同需要另起一个逻辑来写
  7.                 if (e.Col == 5|| e.Col == 6)
  8.                 {
  9.                     if (c1TrueDBGrid1[e.Row, 4].ToString()== "Owner")
  10.                     {
  11.                         e.CellStyle.Locked = false;
  12.                         e.CellStyle.BackColor = Color.LightSeaGreen;
  13.                     }

  14.                 }
  15.             };
复制代码


另外你提到的FetchRowStyle,是在此行渲染时触发,没有必要在这种需求下使用
回复 使用道具 举报
yin_tb
高级会员   /  发表于:2021-3-11 18:12:53
14#
datagridview1.item(row,col).value   是单元格的值
回复 使用道具 举报
yin_tb
高级会员   /  发表于:2021-3-11 18:12:22
13#
这一点不如微软自带的DataGridView,人家这样写  datagridview1.item(row,col).readonly=true   就这么简单,怎么判断都行
回复 使用道具 举报
yin_tb
高级会员   /  发表于:2021-3-11 18:10:36
12#
上面代码不明确,我重写,如下:c1TrueDBGrid1.FetchCellStyle += (s, e) =>
            {
              e.CellStyle.Locked = true;  //锁定所有列,对吧?
                if (tgrid(e.row,颜色标志)=True)
                {
                    e.CellStyle.Locked = False;  //让颜色列表单元格不锁定,和标志不是一个列
                    e.CellStyle.BackColor = Color.LightSeaGreen;
                }
                else if (tgrid(e.row,尺码)=True)
                {
                    e.CellStyle.Locked = False; //让尺码列表单元格不锁定,和尺码标志不是同一列
                    e.CellStyle.BackColor = Color.LightSeaGreen;
                }
                else if (tgrid(e.row,季节)=True)
                {
                   e.CellStyle.Locked = False; //让季节列表单元格不锁定,和标志不是同一列
                    e.CellStyle.BackColor = Color.LightSeaGreen;
                }
            };
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2021-3-11 18:07:07
11#
嗯,主要还是给你提供一个思路,具体还是按照你这边的业务逻辑来写代码。

如果还是无法实现你需要的功能的话,你可以私信给我电话,我电话和你联系沟通
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部