如果您不註銷事件處理程序,這只是一個壞習慣。在您的子控件上,提供註冊/取消註冊事件處理程序的功能。很多奇怪的行爲(幾乎總是很難調試)會發生:就像在同一個控件上多次註冊一個事件處理程序一樣。更不用說內存泄漏了。
下面是我在生產代碼中看到的一個示例。過度簡化了演示過程。
Public Class Form1
Private Sub btnAddHandler_Click(sender As Object, e As EventArgs) Handles btnAddHandler.Click
AddHandler btnClickMe.Click, Sub()
txtLog.Text &= "Clicked!" & vbCrLf
End Sub
txtLog.Text &= "Added event handler." & vbCrLf
End Sub
End Class
對於每次單擊btnAddHandler
,btnClickMe
將追加"Clicked!" & vbCrLf
很多次txtLog被點擊時它。這是一個非常簡單的例子,但是如果你不小心,並且事件做了更重要的事情,它可以爲調試帶來樂趣。 ;)
不,我不會說這是不好的做法,做你在做什麼。發件人是可區分的,只要你不做像上面例子那樣的野蠻事情,你應該沒問題。
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
For Each ctrl As Control In Me.Controls
If TypeOf ctrl Is TextBox Then
With DirectCast(ctrl, TextBox)
AddHandler .GotFocus, AddressOf TextBox_GotFocus
AddHandler .LostFocus, AddressOf TextBox_LostFocus
End With
End If
Next
End Sub
Private Sub TextBox_GotFocus(sender As Object, e As EventArgs)
DirectCast(sender, TextBox).BackColor = Color.Azure
End Sub
Private Sub TextBox_LostFocus(sender As Object, e As EventArgs)
DirectCast(sender, TextBox).BackColor = Color.DimGray
End Sub
Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
For Each ctrl As Control In Me.Controls
If TypeOf ctrl Is TextBox Then
With DirectCast(ctrl, TextBox)
RemoveHandler .GotFocus, AddressOf TextBox_GotFocus
RemoveHandler .LostFocus, AddressOf TextBox_LostFocus
End With
End If
Next
End Sub
End Class
此代碼非常好。
'.Click' ='[「LOCO FOCUS FUNCTION」]?按道理??? – OneFineDay 2014-10-18 23:07:19
[「失去對焦功能」]只是實際功能的替代品。我認爲這樣說更具解釋性。包含函數的名字並不重要,但MyMouseDown()實際上被稱爲 – Solo116 2014-10-19 00:23:50
我知道,我只是沒有想到用失敗事件丟失焦點。 – OneFineDay 2014-10-19 01:06:12