2

我在 C# win form application 4.0 中工作,在一个表单上,我在每个文本框上使用 3 个文本框,当用户输入“Tab”键然后焦点跳转到下一个文本框。

现在在验证事件的第一个文本框中,我添加了一些代码来检查数据有效性,它连接到数据库服务器并花费一些纳秒的时间,同时用户按下更多的“Tab”键,这就是为什么我的焦点转移到第三或第四个文本框,它没有跳到第二个文本框。

请指导我如何解决这个问题。如何忽略这个击键。

我需要一个解决方案,其中用户界面将暂停,直到不执行验证事件。

4

3 回答 3

4

首先,没有理由发送 TAB 键。只需Focus在您想要关注的文本框上进行设置。

您想要做的是OnKeyDown在您希望忽略回车键时收听您关注的文本框或控件。通过设置e.Handledtrue,按键将被忽略。

private void textBox_KeyDown(object sender, KeyEventArgs e)
{
    if (bIgnoreInput)
        e.Handled = true;
}

编辑:

我建议按下按钮来触发验证,而不是仅在文本更改时(如果这是您正在做的事情,因为它不是很清楚)。这样您就可以处理验证并提供用户反馈(例如进度条或等待动画)。

如果您根本不需要任何输入,请在文本框上设置Enabledfalse,直到您处理完代码。未启用控件时,不会触发任何事件。请务必检查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
}
于 2013-03-25T13:25:41.443 回答
3

在调用验证服务器之前调用 GetNextControl 以找出验证完成时应将焦点移至何处。验证完成后,在该控件上调用 Focus()

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.getnextcontrol.aspx

于 2013-03-25T13:26:56.883 回答
1

您可以引入 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}");
}
于 2013-03-25T13:26:01.303 回答