如何让Cancel按钮点击优先于MaskedTextBox的FocusLost事件触发?
解决MaskedTextBox焦点丢失验证与Cancel按钮冲突的方案
针对你遇到的点击Cancel按钮时,MaskedTextBox的Leave事件优先触发验证弹窗导致无法直接退出的问题,这里提供几个可行的解决思路:
方案一:用全局标记跳过验证
核心思路是给Cancel按钮设置一个标识,让Leave事件识别到用户正在取消操作时,直接跳过验证逻辑。
- 先定义一个脚本级的标记变量:
$script:isCanceling = $false
- 给Cancel按钮添加点击事件,设置标记并关闭表单:
$cancelBtn.add_Click({ $script:isCanceling = $true $f1.Close() })
- 修改你的
tb1validation_focuslost函数,开头先判断标记:
function tb1validation_focuslost { # 如果是取消操作,直接返回不验证 if ($script:isCanceling) { return } $script:ans1 = $tb1.Text.ToString() if ($ans1 -le 0 -xor $ans1 -gt 365){ $f2.controls.AddRange(@($e1,$ok2)) $f1.topmost = $False $f2.Topmost = $True $e1.text = "Error - Out of range here." [void]$f2.ShowDialog() $tb1.focus() } elseif ($ans1 -gt 0 -and $ans1 -le 365) { $script:now = [datetime]::Today.AddDays(-$ans1) $script:q1done = 1 $tb1.Enabled = $false $q2.visible = $True $tb2.visible = $True $tb2.focus() } } $tb1.add_leave({tb1validation_focuslost})
方案二:点击Cancel时移除Leave事件处理
直接在Cancel按钮点击时,先移除MaskedTextBox的Leave事件绑定,再关闭表单,这样焦点丢失时就不会触发验证:
$cancelBtn.add_Click({ # 移除Leave事件处理程序 $tb1.remove_leave({tb1validation_focuslost}) $f1.Close() })
这种方法简单直接,适合不需要保留表单后续复用的场景。
方案三:判断焦点去向是否为Cancel按钮
在Leave事件里,检查当前获得焦点的控件是不是Cancel按钮,如果是则跳过验证:
function tb1validation_focuslost { # 获取当前获得焦点的控件 $focusedControl = $tb1.Parent.ActiveControl # 如果焦点在Cancel按钮上,直接返回 if ($focusedControl -eq $cancelBtn) { return } $script:ans1 = $tb1.Text.ToString() # 后续原有验证逻辑不变... }
这个方案不需要额外标记,直接通过焦点控件判断,逻辑更严谨。
内容的提问来源于stack exchange,提问作者Stephen ePrivate
相关产品推荐
相关产品推荐

