2

私はC#winフォームアプリケーション4.0で作業しています。フォームでは、各テキストボックスで3つのテキストボックスを使用しています。ユーザーが「Tab」キーを入力すると、次のテキストボックスにフォーカスジャンプします。

イベントの検証に関する最初のテキストボックスで、データの有効性を確認するためのコードを追加しました。データベースサーバーに接続し、数ナノ秒の時間がかかります。その間、ユーザーはさらに「Tab」キーを押します。そのため、焦点が3番目または4番目のテキストボックス、2番目のテキストボックスにジャンプしませんでした。

この問題を解決する方法を教えてください。このキーストロークを無視する方法。

検証イベントが実行されなくなるまでユーザーインターフェイスが一時停止されるソリューションが必要です。

4

3 に答える 3

4

まず、TABキーを送信する理由はありません。Focusフォーカスしたいテキストボックスに設定するだけです。

OnKeyDownやりたいことは、Enterキーを無視したいときにフォーカスしているテキストボックスまたはコントロールをリッスンすることです。に設定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
}
于 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 に答える