VB.NET 中 TextChanged 事件为何无法重新启用按钮?
数据小陈
结论
按钮状态由几段独立的 If 语句依次设置。原代码中的正则表达式也没有按预期匹配输入,因此有效文本通常无法满足启用条件。可以让三个 TextChanged 事件共用一个处理程序,在输入变化时重新检查所有文本框,再统一设置 Cashout_Btn.Enabled。
原代码用 ^[0-9]^ 检查数字。正则表达式末尾的 ^ 在这里不是结束锚点,而是要匹配的字面字符 ^,所以文本必须以数字开头,并紧跟一个脱字符。^[A-Za-z]^ 也要求字母后面出现 ^。如果要限制整个输入只能包含数字,应使用 ^[0-9]+$。其中 + 表示至少一个字符,$ 表示文本结尾。
集中检查所有输入
下面的示例按原代码体现的规则处理:Item_Txt 只接受字母和数字,Amount_Txt 与 Cost_Txt 只接受数字。任一文本框内容变化时,都会重新检查全部输入:
Imports System.Text.RegularExpressions
Private Sub Inputs_TextChanged(sender As Object, e As EventArgs) _
Handles Item_Txt.TextChanged, Amount_Txt.TextChanged, Cost_Txt.TextChanged
Dim itemValid As Boolean = Regex.IsMatch(Item_Txt.Text, "^[A-Za-z0-9]+$")
Dim amountValid As Boolean = Regex.IsMatch(Amount_Txt.Text, "^[0-9]+$")
Dim costValid As Boolean = Regex.IsMatch(Cost_Txt.Text, "^[0-9]+$")
Cashout_Btn.Enabled = itemValid AndAlso amountValid AndAlso costValid
End Sub
删除或停用原来的三个处理程序,以免它们重复设置按钮状态。也可以保留三个独立处理程序,让它们都调用同一个验证方法。无论采用哪种方式,每次都应根据三个文本框的当前值重新计算按钮状态。
输入规则需要按实际需求调整
这个示例将金额和数量限制为整数。如果 Cost_Txt 允许小数或货币格式,^[0-9]+$ 就不适用,应根据应用允许的小数分隔符、负数等规则调整验证方式。若 Item_Txt 允许空格或其他字符,也应相应修改正则表达式。
备注:内容仅供参考。
