2017-02-21 13 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

をあなたの 'Form'の' AcceptButton'としてボタンを設定した場合、あなたは 'TextBox'のコントロールのいずれかに' Enter'、コードを押してください:差別さまざまなコントロールを選択するための

コードそのボタンが実行されます。この機能を使用すると、Enterキーを処理するためのコードを書く必要はありませんか? –

+1

「this」とは何ですか?すべてのテキストボックスにイベントハンドラを追加する必要があります。 –

+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 

ハンドラでは、命名規則に基づいてさまざまな関数を呼び出しました。 kfully、一貫していた)。その後、

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 
    .... 
関連する問題