You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从自定义控件内部触发窗体事件?

自定义金额输入控件实现分享

我最近做了一个整合了多组文本框、标签和按钮的自定义控件,为了满足业务里的金额输入需求,专门写了自定义事件处理逻辑来实现文本格式化和非法输入拦截的功能。

核心事件处理逻辑

主要针对两个核心事件做了自定义处理:

  • TextChanged:实时拦截非法输入(比如只允许输入数字和小数点),同时在用户输入过程中做初步的格式引导
  • LostFocus:当文本框失去焦点时,做最终的金额校验和格式化,重点处理金额超限的情况

LostFocus事件的核心逻辑

在LostFocus处理程序里,我做了金额上限检查,针对两种不同类型的文本框做了差异化处理:

  • 普通金额文本框:如果输入金额超出上限,直接阻止用户离开这个文本框,同时弹出提示让用户重新输入
  • 关联了按钮的5个特殊文本框:如果金额超限,自动触发对应文本框关联按钮的Click事件,由按钮的逻辑来处理超限后的业务流程

下面是LostFocus事件的代码片段:

Public Sub txtLostFocus(sender As Object, e As EventArgs) Handles txtAmount.LostFocus, txtSpecial1.LostFocus, txtSpecial2.LostFocus, txtSpecial3.LostFocus, txtSpecial4.LostFocus, txtSpecial5.LostFocus
    Dim inputAmount As Decimal
    ' 尝试解析输入为金额
    If Decimal.TryParse(CType(sender, TextBox).Text, inputAmount) Then
        ' 检查是否超过设定的金额上限
        If inputAmount > MAX_ALLOWED_AMOUNT Then
            Select Case sender.Name
                ' 普通文本框:阻止失去焦点并提示
                Case "txtAmount"
                    CType(sender, TextBox).Focus()
                    MessageBox.Show("金额超出允许上限,请重新输入!")
                ' 特殊文本框:触发对应按钮的Click事件
                Case "txtSpecial1" : btnSpecial1.PerformClick()
                Case "txtSpecial2" : btnSpecial2.PerformClick()
                Case "txtSpecial3" : btnSpecial3.PerformClick()
                Case "txtSpecial4" : btnSpecial4.PerformClick()
                Case "txtSpecial5" : btnSpecial5.PerformClick()
            End Select
        End If
    Else
        ' 非合法金额输入的处理,比如清空或者提示
        CType(sender, TextBox).Text = ""
        MessageBox.Show("请输入合法的金额数值!")
    End If
End Sub

另外,TextChanged事件里我会实时过滤掉非数字和非小数点的输入,还会自动处理小数点的位数(比如限制最多两位小数),确保用户输入的内容始终符合金额格式要求。

内容的提问来源于stack exchange,提问作者Daakuryu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:08:20