找回密码
 立即注册

QQ登录

只需一步,快速开始

yin_tb

高级会员

53

主题

200

帖子

1047

积分

高级会员

积分
1047

微信认证勋章

yin_tb
高级会员   /  发表于:2020-9-6 10:43  /   查看:4230  /  回复:8
1金币
如题,我发了个DEMO展示问题。一个Form,上面有两个TrueDBgrid, 一个tgrid1,一个tgrid2。在Form的load中,建了两个datatable,分别绑定到两个tgrid. 两个tgrid都有一个keydown事件,指定当在单元格中按回车时的行为,即:当焦点在最后一个单元格最后一行时,加一行,焦点跳转到下一行第一单元格,如果在最后一单元格但不在最后一行,则不加行,直接跳到下一行第一单元格。tgrid2比tgrid1多了一个RowColChange事件,我在事件中指定EditActive=True  。tgrid2的keydown事件执行的正常。但tgrid1不是,当跳转时,直接到了下一行的第二列,为什么?
附件: 您需要 登录 才可以下载或查看,没有帐号?立即注册

最佳答案

查看完整内容

目前看来是由于按Enter本身系统会将当前选中的单元格右移,导致出现在了第二列 先执行了你这边的KeyDown事件中的代码,然后执行了单元格右移 如果需要避免的话,可以通过添加一个字段判断是否是回车换行导致的cellchange,然后在cellchange事件中将其设置为第一列

8 个回复

倒序浏览
最佳答案
最佳答案
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-9-6 10:43:32
来自 5#
目前看来是由于按Enter本身系统会将当前选中的单元格右移,导致出现在了第二列
先执行了你这边的KeyDown事件中的代码,然后执行了单元格右移

如果需要避免的话,可以通过添加一个字段判断是否是回车换行导致的cellchange,然后在cellchange事件中将其设置为第一列


  1. Dim isentered As Boolean
  2.     Private Sub tgrid2_KeyDown(sender As Object, e As KeyEventArgs) Handles tgrid2.KeyDown
  3.         If e.KeyCode = Keys.Enter Then
  4.             If tgrid2.Col = tgrid2.Columns.Count - 1 Then '当在最后一个单元格时
  5.                 If tgrid2.Row = tgrid2.RowCount - 1 Then  '当在最后一行时自动加一行
  6.                     row2 = dt_unit2.NewRow
  7.                     dt_unit2.Rows.Add(row2)
  8.                     tgrid2.Row = tgrid2.Row + 1 '焦点在下一行第一单元格
  9.                     tgrid2.Col = 0
  10.                 Else '-----------------------------------不在最后一行,不加行,但焦点在下一行第一单元格
  11.                     tgrid2.Row = tgrid2.Row + 1
  12.                     tgrid2.Col = 0
  13.                 End If
  14.                 isentered = True
  15.             End If
  16.         End If
  17.     End Sub

  18.     Private Sub tgrid2_RowColChange(sender As Object, e As RowColChangeEventArgs) Handles tgrid2.RowColChange
  19.         If isentered = True Then
  20.             tgrid2.Col = 0
  21.             isentered = False
  22.         End If
  23.     End Sub
复制代码
回复 使用道具 举报
yin_tb
高级会员   /  发表于:2020-9-6 10:56:30
2#
您可能会觉得我多此一举,直接在RowColChange事件中指定EditActive=True ,这样有光标焦点的编辑模式好看,也能解决跳转问题,但问题是:如果最后一个单元格是复选框,我指定了两个值,0  False   1   True,我在RowColChange中指定不让这个复选框单元格的EditActive=True ,这时,跳转时就跳到下一行的第二列了,为何不让这个复选框的EditActive=True呢?因为EditActive=True时,这个单元格有焦点时,会自动转换成False或True这样的值了,就算我只指定1和0,不出现False或True,也会变成0或1。虽然在复选框列的值项目中我没选中转换。
回复 使用道具 举报
yin_tb
高级会员   /  发表于:2020-9-6 11:04:58
3#
两个tgrid的DirectionAfterEnter属性都是默认的MoveRight,难道是,在最后一个单元格EditActive=False时,我按回车,在代码中指定跳转到下一行第一单元格,TrueDBgrid自动加了了次回车?也就是自动又MoveRight了一次?
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-9-7 09:39:36
4#
问题已经收到,我验证后给您回复
回复 使用道具 举报
yin_tb
高级会员   /  发表于:2020-9-7 19:00:22
6#
您说的是个思路,其实我可以将DirectionAfterEnter设为movenone,手动根据按键来移动焦点,不过那样太麻烦。不过我仍觉得算是产品的一个小BUG。因为在最后一列了,回车时,DirectionAfterEnter的MoveRight应该是不起作用了,我让它到下一行,它不该再替我移动了。另外,马工,为何EditActive=True时,就没这种问题,也不需要你思路里的设个标识,我的两个网格,有一个是EditActive=True的,很正常,您试了吗?
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-9-8 10:46:49
7#
如我上面所说的原因,EditActive=True时由于在编辑状态,
所以和在非编辑状态下,Enter触发的选中单元格右移效果不一样。目前这个问题看起来暂时没有其他的办法,只能这样实现
回复 使用道具 举报
yin_tb
高级会员   /  发表于:2020-9-8 15:50:39
8#
好的,谢谢,也就多两行代码
回复 使用道具 举报
Richard.Ma讲师达人认证 悬赏达人认证 SpreadJS 开发认证
超级版主   /  发表于:2020-9-8 16:06:53
9#
不客气
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部