找回密码
 立即注册

QQ登录

只需一步,快速开始

yinzhm
初级会员   /  发表于:2014-7-10 19:35:00
地板
回复 2楼dafo的帖子

发现一个现象,斑竹看看我描述的对不对,是否可以改进。
需求:按下Tab键的时候移动活动单元格,移动之前,在CellValidating事件中check单元格的值,如果值不正确则取消移动Cancel,将该单元格的颜色设置为红色,感觉这是很常用的需求。
现象:Check失败后,单元格显示的颜色没有变化,但是输出log发现该单元格的颜色的确已经被设置为红色,只不过没有重绘。
猜测原因:在CellValidating中设置颜色,当CellValidatin被Cancel之后,执行了CellLeave和CellEnter事件,但是这两个事件没有重新绘制颜色。为什么没有执行CellBeginEdit和CellEndEdit事件?我猜测是Tab键默认并没有绑定BeginEdit和EndEdit的动作,同时Cancel前后该单元格的EditState没有变化,所以可能内部没有执行CellXXXXEdit事件。
基于以上分析,我给Tab键绑定了BeginEdit和EndEdit两个动作,结果颜色就被成功设置了。
是不是说颜色修改以后,需要触发BeginEdit后,颜色才会真正被绘制到单元格上?(大部分情况下CellEnter和BeginEdit好像都会执行,但是以上情况比较特殊)
回复 使用道具 举报
yinzhm
初级会员   /  发表于:2014-7-10 18:55:00
板凳
回复 2楼dafo的帖子

好!
这种方案我尝试过,这样做的话相当于彻底把这个键屏蔽了。
我只是希望Tab键做触发默认动作,然后在KeyDown中处理Tab键的行为。

几经周折,问题已经解决了。
多谢版主。
回复 使用道具 举报
dafo
版主   /  发表于:2014-7-9 18:42:00
沙发
MultiRow没有做任何的处理,这时你的消息被直接派发到了GcMultiRow.EditingControl上,默认TextBoxCell的EditingControl是TextBox,它内部有特殊的Tab处理逻辑,所以想禁止他的能力你需要在Form的ProcessDialogKey中Handle这个消息。
示例代码:

  1.         protected override bool ProcessDialogKey(Keys keyData)
  2.         {
  3.             if (keyData == Keys.Tab)
  4.             {
  5.                 if (this.ActiveControl != null &&
  6.                     this.ActiveControl.Parent != null &&
  7.                     this.ActiveControl.Parent.Parent is GcMultiRow)
  8.                 {
  9.                     return false;
  10.                 }
  11.             }
  12.             return base.ProcessDialogKey(keyData);
  13.         }
复制代码
回复 使用道具 举报
12
您需要登录后才可以回帖 登录 | 立即注册
返回顶部