找回密码
 立即注册

QQ登录

只需一步,快速开始

yinzhm

初级会员

32

主题

129

帖子

339

积分

初级会员

积分
339

活字格认证微信认证勋章

yinzhm
初级会员   /  发表于:2014-7-9 16:18  /   查看:11247  /  回复:12
好!
MultiRow For Winforms 7.0

如果一个键绑定了Action动作,该键就不会触发KeyDown事件。     目前试验的结果是这样,不过觉得这样也合理。如果想要在KeyDown事件中处理按键,需要先将Action清除。(个别按键,如Tab,还需要PreviewKeyDown中额外处理)

问题:
Me.GcMultiRow1.ShortcutKeyManager.Clear()
Me.GcMultiRow1.EditMode = EditMode.EditOnEnter
这种设置下,在Cell中按下Tab键,我认为应该没有任何动作,但是实际上Tab键按下后,会使MultiRow失去焦点,触发Leave事件。
从现象上看像是执行了系统的Tab动作。
但是我在ProcessCmdKey将Tab键吃掉了,按下tab键的时候仍然触发Leave事件。
所以是不是MultiRow在这种情况下,做了什么处理?

12 个回复

倒序浏览
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.         }
复制代码
回复 使用道具 举报
yinzhm
初级会员   /  发表于:2014-7-10 18:55:00
板凳
回复 2楼dafo的帖子

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

几经周折,问题已经解决了。
多谢版主。
回复 使用道具 举报
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好像都会执行,但是以上情况比较特殊)
回复 使用道具 举报
dafo
版主   /  发表于:2014-7-11 18:17:00
5#
我试验了你的Case,但是在我这里单元格背景色是可以更新的,是否可以给一些你的相关代码我们测试下,或者你建一个干净的Sample测试下。
如果你要刷新GcMultiRow建议使用方法this.gcMultiRow1.Refresh()来强制刷新,不用调用BeginEdit和EndEdit。
回复 使用道具 举报
yinzhm
初级会员   /  发表于:2014-7-11 19:36:00
6#
回复 5楼dafo的帖子

使用干净的Sample也不好使。

Private Sub EidtMultiRow_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Me.GcMultiRow1.EditMode = GrapeCity.Win.MultiRow.EditMode.EditOnEnter
        Me.GcMultiRow1.ShortcutKeyManager.Clear()
    End Sub

    Private Sub GcMultiRow1_KeyDown(sender As Object, e As KeyEventArgs) Handles GcMultiRow1.KeyDown
        If e.KeyCode = Keys.Enter Then
            GrapeCity.Win.MultiRow.SelectionActions.MoveToNextCell.Execute(Me.GcMultiRow1)
        End If
    End Sub

    Private Sub GcMultiRow1_EditingControlShowing(sender As Object, e As GrapeCity.Win.MultiRow.EditingControlShowingEventArgs) Handles GcMultiRow1.EditingControlShowing
        Dim controlType As String = e.Control.GetType.Name

        If controlType = "TextBoxEditingControl" Then
            Dim tbControl As TextBoxEditingControl = TryCast(e.Control, TextBoxEditingControl)
            If tbControl IsNot Nothing Then

                RemoveHandler tbControl.KeyDown, AddressOf Me.GcMultiRow1_KeyDown
                AddHandler tbControl.KeyDown, AddressOf Me.GcMultiRow1_KeyDown
            End If
        End If
    End Sub

    Private Sub GcMultiRow1_CellValidating(sender As Object, e As CellValidatingEventArgs) Handles GcMultiRow1.CellValidating
        If e.FormattedValue = "123" Then
            Me.GcMultiRow1.CurrentCell.Style.BackColor = Color.Red
            e.Cancel = True
        End If
    End Sub
回复 使用道具 举报
yinzhm
初级会员   /  发表于:2014-7-11 19:37:00
7#
回复 5楼dafo的帖子

不好意思,高级编辑器被屏蔽了,使用不了。
回复 使用道具 举报
dafo
版主   /  发表于:2014-7-14 14:44:00
8#
GcMultiRow只有在进入编辑状态时才渲染EditingControl,在你的Case中当Validating失败,EditingControl没有机会退出编辑状态,应此你之前的方案是一个办法,强行EndEdit再EnterEdit使得GcMultiRow有一个机会把Cell对象上用户设置的Style应用到EditingControl上。
我这里有另外一个方案,你可以参考:

  1.         void gcMultiRow1_CellValidating(object sender, GrapeCity.Win.MultiRow.CellValidatingEventArgs e)
  2.         {
  3.             this.gcMultiRow1.CurrentCell.Style.BackColor = Color.Red;
  4.             this.gcMultiRow1.EditingControl.BackColor = Color.Red;
  5.             this.gcMultiRow1.EditingPanel.BackColor = Color.Red;
  6.             e.Cancel = true;
  7.         }
复制代码
回复 使用道具 举报
yinzhm
初级会员   /  发表于:2014-7-14 14:52:00
9#
回复 8楼dafo的帖子

了解了,和我想象的一样,明白为什么就好了。
谢谢斑竹的解答和方案!
回复 使用道具 举报
yinzhm
初级会员   /  发表于:2014-7-14 15:02:00
10#
回复 8楼dafo的帖子

以前对EditingControl和Cell没什么理解,遇到了一些问题之后,发现应该好好认识一下。
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部