找回密码
 立即注册

QQ登录

只需一步,快速开始

chenf1980

论坛元老

41

主题

147

帖子

9349

积分

论坛元老

积分
9349

活字格认证

chenf1980
论坛元老   /  发表于:2011-4-14 13:59  /   查看:10159  /  回复:10
在一个MultiRow里面,有些Cell是只读的,有些是可编辑的。
现在做了一个KeyDown事件,结果发现不触发了?是怎么回事?
Private Sub ExMultiRow1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles ExMultiRow1.KeyDown
                MessageBox.Show("keyenter2")
   
    End Sub

10 个回复

倒序浏览
robert
金牌服务用户   /  发表于:2011-4-14 14:58:00
沙发
这是因为MultiRow默认会把回车键注册成进入编辑状态的快捷键。如果当前选择的Cell可以进入编辑状态,MultiRow会先响应快捷键,进入编辑状态。进入编辑状态后当前窗口的焦点就会从MultiRow转移到编辑控件上,所以这时MultiRow就收不到KeyDown事件了。

这里提供两种解决方案供您选择,希望可以解决您的用例
1. 如果你希望通过MultiRow的事件处理键盘消息,可以尝试使用PreviewKeyDown事件,这个事件的时机比MultiRow的快捷键要早。

  1.     Private Sub ExMultiRow1_PreviewKeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles ExMultiRow1.PreviewKeyDown
  2.         MessageBox.Show("PreviewKeyDown")
  3.     End Sub
复制代码
2. 当然如果你不希望按下回车键时使得MultiRow进入编辑状态,你可以使用以下代码移除一个默认快捷键

  1. ExMultiRow1.ShortcutKeyManager.Unregister(Keys.Enter)
复制代码
回复 使用道具 举报
chenf1980
论坛元老   /  发表于:2011-4-14 16:57:00
板凳
其它情况是正确了,但是现在的cell的editmode是EditOnEnter,这样的话就没办法触发了?
回复 使用道具 举报
chenf1980
论坛元老   /  发表于:2011-4-14 17:04:00
地板
现在需要的效果就是,enter键按下去,然后行里面的单元格一个个的聚焦下去,碰到某个单元格的时候,执行函数 setname
回复 使用道具 举报
chenf1980
论坛元老   /  发表于:2011-4-14 17:05:00
5#
但是这个单元格的效果模式是EditOnEnter的。
回复 使用道具 举报
robert
金牌服务用户   /  发表于:2011-4-14 17:17:00
6#
是的,在EditOnEnter的情况下,编辑控件会始终保持着焦点,所以键盘消息都会发给编辑控件,而不会发给MultiRow。

请尝试以下代码,看是否可以解决您的用例

  1.     Private Sub GcMultiRow1_EditingControlShowing(ByVal sender As Object, ByVal e As GrapeCity.Win.MultiRow.EditingControlShowingEventArgs) Handles GcMultiRow1.EditingControlShowing
  2.         RemoveHandler e.Control.KeyDown, AddressOf EditingControl_KeyDown
  3.         AddHandler e.Control.KeyDown, AddressOf EditingControl_KeyDown
  4.     End Sub
  5.     Private Sub EditingControl_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
  6.         MessageBox.Show("keyenter2")
  7.     End Sub
复制代码
说明:以上代码是在EditingControlShowing事件中有挂了编辑控件的KeyDown事件。这样就可以处理发送给编辑控件的键盘事件了。
需要注意到是,每次装载编辑控件,都会触发EditingControlShowing事件,所以在AddHandler之前先RemoveHandler一次,以确保事件只会被挂一次。
回复 使用道具 举报
chenf1980
论坛元老   /  发表于:2011-4-14 17:46:00
7#
很抱歉,你说的这个代码,我在日本官网上也看到过,但是不适用哦。按下enter,也没有进行触发
回复 使用道具 举报
robert
金牌服务用户   /  发表于:2011-4-14 18:12:00
8#
因为我不清楚您的实际用例,只能猜测着给您一些解决方案。不知道为什么上边的代码不能用。如果不牵涉机密的话,可否把您的需求描述的稍微具体一点。以方便我给你提供更好的解决方案。

另外,重定义MultiRow的快捷键可能能解决您的问题,请尝试以下代码
1. 在FormLoad事件处理函数中加入以下代码,注册一个快捷键。这里以Enter键为示例,您可以把这个Action通过ShortcutKeyManager.Register方法注册到任意键上
  1.         GcMultiRow1.ShortcutKeyManager.Unregister(Keys.Enter)
  2.         GcMultiRow1.ShortcutKeyManager.Register(New MyAction(), Keys.Enter)
复制代码
2. 增加一个名叫MyAction的类,在Execute方法中实现指定键的业务逻辑。
  1. Friend Class MyAction
  2.     Implements IAction
  3.     Public Function CanExecute(ByVal target As GcMultiRow) As Boolean Implements IAction.CanExecute
  4.         Return True
  5.     End Function
  6.     Public Sub Execute(ByVal target As GcMultiRow) Implements IAction.Execute
  7.         MessageBox.Show("keyenter2")
  8.     End Sub
  9.     Public ReadOnly Property DisplayName As String Implements IAction.DisplayName
  10.         Get
  11.             Return ""
  12.         End Get
  13.     End Property
  14. End Class
复制代码
回复 使用道具 举报
chenf1980
论坛元老   /  发表于:2011-4-14 21:13:00
9#
恩,按照你的做法,是可以正确控制了。现在还有个问题,就是按下enter键后,我想光标移到下一个单元格,但是发现还是不对。代码如下:
If (target.SelectedRows(0).Item("C1").Selected = True) Then
            MessageBox.Show("keyenter2")
            Dim index As Integer = target.SelectedRows(0).Index
            target.SelectedRows(0).Cells("C1").Selected = False
            target.CurrentCell = target.Item(index, "C2")
            target.CurrentCell.Selected = True
End If
target.Focus()
回复 使用道具 举报
chenf1980
论坛元老   /  发表于:2011-4-14 21:14:00
10#
虽然target.SelectedRows(0).Cells("C1").Selected = False
了,但是按下enter键后,还是走了进去,不知道为什么
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部