2017-02-21 75 views
0

我有一個窗體,上面有40個不同的文本框。最近他們要求我添加功能,以便他們可以在按下Enter鍵時運行報告(而不是單擊按鈕)。 所以,我試圖在我的表單上創建一個通用的事件處理程序來捕獲在各種控件中引發的事件(而不是附加處理程序來控制我創建的)。 我有代碼正在運行,但事件似乎沒有起泡到主窗體。你能指出我錯過了什麼嗎?如何將事件從一類控件發佈到父窗體

Public Class TextboxSelect 
    Inherits System.Windows.Forms.TextBox 
    Public Sub New() 
     AddHandler Enter, AddressOf selectText 
     AddHandler KeyDown, AddressOf raiseEnterEvent 
    End Sub 

    Public Event enterPressed As EventHandler 
    Private Sub selectText(sender As Object, e As EventArgs) 
     Dim text As TextboxSelect = CType(sender, TextboxSelect) 
     text.SelectionStart = 0 
     text.SelectionLength = text.Text.Length + 1 
    End Sub 

    Public Sub raiseEnterEvent(sender As Object, e As KeyEventArgs) 
     RaiseEvent enterPressed(Me, New EventArgs) 
     If (e.KeyCode = Keys.Enter) Then 
      RaiseEvent enterPressed(Me, New EventArgs) 
     End If 
    End Sub End Class 

主要形式:

Private Sub textboxEnterSearch(sender As Object, e As EventArgs) Handles this.enterPressed 
    MessageBox.Show("You hit enter in a textbox!") 
End Sub 

調試時,我提高enterPressed事件,但似乎該事件不冒泡的形式。

+1

,那麼當你按下'Enter'任何你'TextBox'控制,代碼該按鈕將被運行。使用這個功能似乎你不需要編寫任何代碼來處理Enter鍵,對嗎? –

+1

這是什麼?您必須將事件處理程序添加到所有文本框。 –

+0

@RezaAghaei在理論上,如果我這樣做,我不需要textboxSelect類中的代碼,但是如果用戶在不在文本框中時按下Enter鍵,它會不會導致它運行? – Rolan

回答

0

我結束了在窗體的負載部分添加一個處理程序:

Dim cv = GetAllControls(Me).OfType(Of TextboxSelect) 
     For Each obj In cv 
      Dim bob As TextboxSelect = CType(obj, TextboxSelect) 
      AddHandler bob.KeyDown, AddressOf enterBox 
     Next 

這裏的代碼中引用的函數:

Private Function GetAllControls(container As Control) As IEnumerable(Of Control) 
    Dim controlList As New List(Of Control)() 
    For Each c As Control In container.Controls 
     controlList.AddRange(GetAllControls(c)) 
     If TypeOf c Is TextBox Then 
      controlList.Add(c) 
     End If 
    Next 
    Return controlList 
End Function 

然後在處理程序中,我根據命名約定調用了不同的函數(它比可愛,一致)。

選購區分不同的控件代碼:如果您設置一個按鈕,你的``Form`的AcceptButton`

Private Sub enterBox(ByVal sender As Object, ByVal e As KeyEventArgs) 

    If e.KeyCode = Keys.Enter Then 
     If CType(sender, TextboxSelect).Name Like "*Cmd1*" Then 
      Cmd1_Click(sender, e) 
     Else 
      Cmd2Search_Click(sender, e) 
     End If 
    End If 
End Sub 
1

您不需要控件上的自定義事件,也不需要在窗體上的每個控件上附加處理程序。

在設計器中,將您的表單的KeyPreview屬性設置爲True。然後處理form_KeyDown事件,並在那裏檢查Enter鍵是否被按下。表單的KeyPreview屬性首先在窗體上觸發鍵事件,然後在任何控件上實際按下它。

+0

那麼,我將如何區分由表單引發的事件和由文本框引發的事件?如果事件不是來自文本框,我不希望觸發它。 – Rolan

+0

如果您的文本框直接位於您的表單上,您可以檢查「Me.ActiveControl」屬性以獲取哪個控件具有焦點 –

1

要檢查誰引發的事件 -

If TypeOf ActiveControl Is TextBox Then 
    .... 
相關問題