2014-10-18 47 views
0

我創建了一堆自定義控件,其中一個特性是當它們處於活動狀態時突出顯示。例如,文本框的邊框將在用戶點擊該對話框時突出顯示一種顏色(或者它有其他輸入焦點),然後當用戶在控件之外點擊時默認回到灰色(包括其他控件)VB.NET使用AddHandler檢測鼠標在控件外部的點擊時間是不好的做法嗎?

目前我掃描父窗體,並使用每個包含在(包括兒童)控件的AddHandler發現,當用戶點擊了控制之外

Private Sub GatherChildren(Optional ByVal CTRL As Control = Nothing) 
    For Each Child As Object In CTRL.Controls 
     If TypeOf Child Is MetroControl Then 
      If DirectCast(Child, MetroControl).Controls.Count > 0 Then 
       GatherChildren(Child) 
      End If 
      AddHandler Child.Click, ["LOSE FOCUS FUNCTION"] 
     End If 
    Next 
End Sub 

我讀的地方在很久以前添加處理程序會嚴重降低性能,並且可能會在表單上有很多控件的環境中。這可能會嚴重影響性能。所以我的問題是,AddHandler對性能有負面影響嗎?如果是這樣,是否有更有效的方法可以解決我的問題?

謝謝

+0

'.Click' ='[「LOCO FOCUS FUNCTION」]?按道理??? – OneFineDay 2014-10-18 23:07:19

+0

[「失去對焦功能」]只是實際功能的替代品。我認爲這樣說更具解釋性。包含函數的名字並不重要,但MyMouseDown()實際上被稱爲 – Solo116 2014-10-19 00:23:50

+0

我知道,我只是沒有想到用失敗事件丟失焦點。 – OneFineDay 2014-10-19 01:06:12

回答

0

如果您不註銷事件處理程序,這只是一個壞習慣。在您的子控件上,提供註冊/取消註冊事件處理程序的功能。很多奇怪的行爲(幾乎總是很難調試)會發生:就像在同一個控件上多次註冊一個事件處理程序一樣。更不用說內存泄漏了。

下面是我在生產代碼中看到的一個示例。過度簡化了演示過程。

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 

對於每次單擊btnAddHandlerbtnClickMe將追加"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 

此代碼非常好。