2

私はwinformアプリケーションを持っていて、メインフォームにテキストボックスを配置しました。

私が望むのは、OnTextChangedイベントで、入力された文字と一致するリストを取得するために、SQL (ストアド プロシージャ) テーブルをクエリする必要があることです。たとえば、文字 A を入力すると、自動的にデータベースに移動して文字「A」で始まる名前を検索する必要があります。次に文字「L 」を入力すると、「 AL」で始まる名前を検索する必要があります。 .

問題は、ユーザーがすばやく入力すると、進行中の非同期プロセスをキャンセルし、最後に入力した文字のタスクのみを保持する必要があるということです。

これらを達成する方法の手がかりはありますか?

4

1 に答える 1

2

問題は、ユーザーがすばやく入力した場合、非同期プロセス をキャンセルする必要があるということです。何もキャンセルする必要はありません。トリックは、ユーザーが入力を停止したと思うまで何も開始しないことです。

私は少し似たようなものを書きました。ユーザーがスレッドに新しいメソッドを開始させると入力すると、メソッドは (構成可能な) 時間待機してから実行されました。別のキーストロークでメソッドが再度呼び出され、待機期間がリセットされます。事実上、誰かが入力を続けた場合、タスクは実行されません。彼らが停止するとすぐに(たとえば、200ミリ秒の一時停止の後)。

私があなただったら、似たようなものを実装します。必要がないときにSQLに行くのを避けるからです

更新 - 簡単な例として、新しいフォームとデフォルトのテキスト ボックスを備えた新しいプロジェクトでは、次のコードが必要に応じて機能できるようにする必要があります (非常に単純な出発点として)。

 public partial class Form1 : Form
    {
        private bool _waiting;
        private bool _keyPressed;
        private const int TypingDelay = 220; // ms used for delay between keystrokes to initiate search

        public Form1()
        {
            InitializeComponent();
        }

        private void WaitWhileUserTyping()
        {
            var keepWaiting = true;

            while (keepWaiting)
            {
                _keyPressed = false;

                Thread.Sleep(TypingDelay);

                keepWaiting = _keyPressed;
            }

            Invoke((MethodInvoker)(ExecuteSearch));

            _waiting = false;
        }

        private void ExecuteSearch()
        {
            Thread.Sleep(200); // do lookup

            // show search results...
            MessageBox.Show("Search complete");
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

            if (_waiting)
            {
                _keyPressed = true;
                return;
            }

            _waiting = true;
            // kick off a thread to do the search if nothing happens after x ms
            ThreadPool.QueueUserWorkItem(_ => WaitWhileUserTyping());
        }
    }
于 2013-10-04T23:38:12.017 に答える