这是我的场景。我正在使用验证事件。如果我引入了错误的值(因为我的验证事件的逻辑确定它是错误的),它不会在 Tab 键时从该 TextBox 中解放焦点,但是,这是否意味着当我单击时它也不会这样做另一个文本框?
我是否缺少有关验证的信息?我是否应该使用另一种方式来强制数据验证,如果我想要焦点上的自由,或者我可以实现一个释放它的点击事件?
这是我使用的验证事件,例如,名称(“Nombre”):
private void tbNombre_Validating(object sender, CancelEventArgs e)
{
if (!new Validator().ValidateWithRegex("^[a-zA-ZÁáÀàÉéÈèÍíÌìÓóÒòÚúÙùÑñüÜ ]{2,20}$", tbNombre.Text))
{
e.Cancel = true;
MessageBox.Show(
"El nombre debe estar formado por letras (longitud: 2 a 20 caracteres)",
"Error en nombre",
MessageBoxButtons.OK, MessageBoxIcon.Error);
tbNombre.Text = "";
}
else
{
_emp.Nombre = tbNombre.Text;
}
}
Validating 事件处理程序的本质是操纵哪个控件具有焦点,而且在此事件中设置焦点是一个坏主意。
从MSDN上的Validating
事件:
当您使用键盘(TAB、SHIFT+TAB 等)、通过调用 Selector SelectNextControl 方法或通过将 ContainerControl.ActiveControl 属性设置为当前窗体来更改焦点时,焦点事件按以下顺序发生:
进入、GotFocus、离开、验证、验证、LostFocus
当您使用鼠标或通过调用 Focus 方法更改焦点时,焦点事件按以下顺序发生:
进入、GotFocus、LostFocus、离开、验证、验证
不要尝试在 Enter、GotFocus、Leave、LostFocus、Validating 或 Validated 事件处理程序中设置焦点。这样做可能会导致您的应用程序或操作系统停止响应。
所以 GotFocus / Leave / LostFocus 事件都被触发并在这个Validating
事件中被操纵,因此,在这里尝试自己处理焦点是一个坏主意。
如果您想要自由地验证您的字段并仍然允许更改焦点,您应该将您的代码移动到Leave
事件中。在这里,您仍然可以验证文本框的值,同时仍然允许其他控件获得焦点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句