我有一个表单,上面有大约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事件,但该事件似乎没有冒泡到窗体中。
发布于 2017-05-11 01:23:08
我最终在表单的load部分添加了一个处理程序:
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然后,在处理程序中,我根据命名约定调用了不同的函数(谢天谢地,这是一致的)。
用于选择区分不同控件的代码:
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 Subhttps://stackoverflow.com/questions/42377327
复制相似问题