我创建了一个包含许多文本框,标签和按钮的用户控件。
在自定义控件中,有自定义处理程序处理lostfocus和textchanged以进行格式化和错误的输入预防。
作为lostfocus处理程序的一部分,检查输入的数量是否太大,或者阻止用户退出文本框,或者对于具有相关按钮的5个文本框触发按钮单击事件。
Public Sub txtLostFocus(sender As Object, e As System.ComponentModel.CancelEventArgs)
Dim txt = DirectCast(sender, TextBox)
Dim sAmtText As String = txt.Text
If sAmtText <> "" Then
If txt.Tag = "Money" Then
sAmtText = sAmtText.Replace(",", String.Empty)
sAmtText = sAmtText.Replace("$", String.Empty)
If Val(sAmtText) > 999999.99 Then
MsgBox("The amount you are trying to enter is too large.")
Select Case txt.Name
Case "txtNetSales"
btnNetSalesBreak_Click(sender, e)
Case "txtCdnCash"
btnCashBreak_Click(sender, e)
Case "txtCheques"
btnChequesBreak_Click(sender, e)
Case "txtCredit"
btnCreditBreak_Click(sender, e)
Case "txtFloat"
btnFloatBreak_Click(sender, e)
Case Else
e.Cancel = True
End Select
Else
txt.Text = FormatCurrency(txt.Text)
End If
End If
End If
End Sub
在自定义控件本身中,这可以正常工作。
在我的表单应用程序中,我添加了大约十几个这样的内容,并且我循环遍历其中的控件以创建通用处理程序。
For Each pnl As Control In cs.Controls
For Each ctrl As Control In pnl.Controls
Select Case ctrl.GetType()
Case GetType(Button)
AddHandler ctrl.Click, AddressOf ButtonClick
Case GetType(TextBox)
AddHandler ctrl.KeyPress, AddressOf txtKeyPress
End Select
Next
Next
然而,即使在表单上的单击执行它需要做的事情,在自定义控件内引发的单击事件似乎没有击中表单内的处理程序。 (现在只是一个带按钮名称的消息框)
此外,如果我在自定义控件中放置一个消息框,那么代码只运行自定义控件,甚至可以单击lostfocus,但单击按钮本身会触发内部和外部的一个。
因此,从自定义控件内部调用的事件与甚至在其外部创建的事件进行交互也是如此,如果是这样,我做错了什么?
或者我是否必须将丢失的焦点代码移出控件?
任何意见都会受到赞赏。