TreeView控件中KeyDown和KeyUp事件的bug

singlion 2018-05-16 06:15:51
先上代码


Private Sub Form_Load()
With TreeView1
.Nodes.Add , , "k1", "1"
.Nodes.Add , , "k2", "2"
.Nodes.Add , , "k3", "3"
.Nodes.Add , , "k4", "4"
End With
End Sub

Private Sub Text1_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case vbKey1
If (Shift And vbAltMask) > 0 Then TreeView1.Nodes("k1").Selected = True
Case vbKey2
If (Shift And vbAltMask) > 0 Then TreeView1.Nodes("k2").Selected = True
Case vbKey3
If (Shift And vbAltMask) > 0 Then TreeView1.Nodes("k3").Selected = True
Case vbKey4
If (Shift And vbAltMask) > 0 Then TreeView1.Nodes("k4").Selected = True
End Select
End Sub

Private Sub TreeView1_KeyDown(KeyCode As Integer, Shift As Integer)
Select Case KeyCode
Case vbKey1
If (Shift And vbAltMask) > 0 Then TreeView1.Nodes("k1").Selected = True
Case vbKey2
If (Shift And vbAltMask) > 0 Then TreeView1.Nodes("k2").Selected = True
Case vbKey3
If (Shift And vbAltMask) > 0 Then TreeView1.Nodes("k3").Selected = True
Case vbKey4
If (Shift And vbAltMask) > 0 Then TreeView1.Nodes("k4").Selected = True
End Select
End Sub


bug描述:
本意是按Alt+数字以使TreeView1中的指定节点被选中,但在TreeView控件的KeyDown事件中,上面的代码会出现一些问题,
1,在长时间未按任何键时,按下数字键,此时并未按下Alt键,却能够使对应的节点被选中。在快速连续按键时,没有这种现象。
2,在正常按下Alt+数字键并触发正确反应之后,抬起Alt键,再按数字键,此时Alt键并未按下,却仍能选中对应节点。不过,在抬起Alt键之后的这种异常现象只会出现一次。
3,同样的代码,复制到TextBox 或其他控件的KeyDown事件中,则可以完全正常的控制Treeview节点的选择。

...全文
329 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
singlion 2018-05-16
  • 打赏
  • 举报
回复
明白了,只要节点的文字不以数字开头就不会出现所谓的bug了
舉杯邀明月 2018-05-16
  • 打赏
  • 举报
回复
这并不是Bug,只是你没有了解它的“运行机制”而已。 你的 TreeView1_KeyDown( ) 事件代码可以说是多余的。 在 TreeView1“有焦点”时,你直接按数字(不管主键盘还是小键盘的)1到4,对应的节点就可以直接选定。   而你的“Alt + 数字”的,还必须是主键盘的数字才行。  另外,“快速按数字”,其实它当成“组合串”处理的。 比如写下这段代码(“窗体”按目前的设计,并且只要这个过程代码,其它删除):
Private Sub Form_Load()
    With TreeView1
        .Nodes.Add , , "k1", "1"
        .Nodes.Add , , "k2", "2"
        .Nodes.Add , , "k3", "3"
        .Nodes.Add , , "k4", "4"
        .Nodes.Add , , "k5", "51"
        .Nodes.Add , , "k6", "52"
        .Nodes.Add , , "k7", "53"
        .Nodes.Add , , "k8", "54"
    End With
End Sub
运行程序,让 TreeView1获得焦点; 当你慢速的按1、2、3、4时(顺序任意),前面4个相应的节点会自动选定; 当你慢速的按 5 时,51、52、53、54会依次、循环的被选定1个; 当你“快速”的按5和“1到4”两个键时,对应的“组合”节点直接被选定。

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧