我在 C# win form application 4.0 中工作,在一个表单上,我在每个文本框上使用 3 个文本框,当用户输入“Tab”键然后焦点跳转到下一个文本框。
现在在验证事件的第一个文本框中,我添加了一些代码来检查数据有效性,它连接到数据库服务器并花费一些纳秒的时间,同时用户按下更多的“Tab”键,这就是为什么我的焦点转移到第三或第四个文本框,它没有跳到第二个文本框。
请指导我如何解决这个问题。如何忽略这个击键。
我需要一个解决方案,其中用户界面将暂停,直到不执行验证事件。
我在 C# win form application 4.0 中工作,在一个表单上,我在每个文本框上使用 3 个文本框,当用户输入“Tab”键然后焦点跳转到下一个文本框。
现在在验证事件的第一个文本框中,我添加了一些代码来检查数据有效性,它连接到数据库服务器并花费一些纳秒的时间,同时用户按下更多的“Tab”键,这就是为什么我的焦点转移到第三或第四个文本框,它没有跳到第二个文本框。
请指导我如何解决这个问题。如何忽略这个击键。
我需要一个解决方案,其中用户界面将暂停,直到不执行验证事件。
首先,没有理由发送 TAB 键。只需Focus
在您想要关注的文本框上进行设置。
您想要做的是OnKeyDown
在您希望忽略回车键时收听您关注的文本框或控件。通过设置e.Handled
为true
,按键将被忽略。
private void textBox_KeyDown(object sender, KeyEventArgs e)
{
if (bIgnoreInput)
e.Handled = true;
}
编辑:
我建议按下按钮来触发验证,而不是仅在文本更改时(如果这是您正在做的事情,因为它不是很清楚)。这样您就可以处理验证并提供用户反馈(例如进度条或等待动画)。
如果您根本不需要任何输入,请在文本框上设置Enabled
为false
,直到您处理完代码。未启用控件时,不会触发任何事件。请务必检查InvokeRequired
是否Invoke
是。
void ValidateInput()
{
SetisValidatingState(true);
System.Threading.Thread workThread = new System.Threading.Thread(delegate()
{
////
// Validate here
////
SetisValidatingState(false);
});
workThread.Start();
}
delegate void SetisValidatingStateDelegate(bool state);
void SetisValidatingState(bool state)
{
if (InvokeRequired)
{
Invoke(new SetisValidatingStateDelegate(SetisValidatingState), new object[] { state });
return;
}
textBox1.AcceptsTabs = textBox2.AcceptsTabs = textBox3.AcceptsTabs = textBox4.AcceptsTabs = !state; // Disable tab while validating = true
progressBar.visible = state; // show progress while validating = true
}
在调用验证服务器之前调用 GetNextControl 以找出验证完成时应将焦点移至何处。验证完成后,在该控件上调用 Focus()
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.getnextcontrol.aspx
您可以引入 bool 类型的标志 (dbFlag),您可以在执行数据库操作之前设置该标志,然后再将其重置。
您的 KeyDown-Code 可以看起来像:
private void KeyDown(object sender, KeyDownEventArgs e)
{
//check the state of your flag
if(!dbFlag && e.KeyCode == Keys.Return)
SendKeys.Send("{Tab}");
}