一、背景
同事叫帮忙看看程序,程序是vb.net程序,描述:一个Form(有KeyDown事件处理代码Form1_KeyDown())上面有一些按钮,这些按钮都注册了KeyDown事件。按理说程序启动起来,界面出来后,即一特定的键只有按钮的KeyDown事件发生。不幸的是,击键一次会执行两次事件处理代码。主要代码如下:

2
Public Class Form13
Inherits System.Windows.Forms.Form4

5


6

7
Public Sub RegistEvent(ByVal ctrTarget As Control)8
AddHandler ctrTarget.KeyDown, AddressOf Me.Form1_KeyDown9

10
Me.RegistEvent(ctrTarget.Controls)11

12
End Sub13

14
Public Sub UnRegistEvent(ByVal ctrTargets As Control.ControlCollection)15
Dim ctrTarget As Control16

17
If (ctrTargets Is Nothing) Then18
Return19
End If20

21
For Each ctrTarget In ctrTargets22
Me.UnRegistEvent(ctrTarget)23
Next24
End Sub25

26
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load27

28


29

30
If (Me._autoRegistEvent) Then31
Me.RegistEvent(Me.Controls)32
End If33

34


35

36
End Sub37

38
Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown39

40


41

42
End Sub43

44


45

46
End Class47

二、徒劳的探索
由于是初接触.NET我也不知道该怎么办,只好step-by-step呗。昨天一个下午都没有跟踪出来,发现一切好像都很合适。这中间还搞了一个闹剧,说是把“Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown”中的“Handles MyBase.KeyDown”给去掉,呵呵。但是从这里我已经看出来了:该子程序仍然在处理Form1的KeyDown事件,这是关键中的关键,结果还是没有找出来为什么。
三、夜间的思考
思考了好久,仍然想不出来新的见解……
四、问题的解决
今天上班以来就把问题锁定在Form1上,不知道哪里出错了,估计是属性设置上有点问题。突然间发现

将该项设为false时,发现一切都好了……哭笑不得
注:Form.KeyPreview 属性——获取或设置一个值,该值指示在将键事件传递到具有焦点的控件前,窗体是否将接收此键事件。

浙公网安备 33010602011771号