1

ユーザーがテキスト ボックスに書き込む情報を使用して SQL データベースにクエリを実行する最初のプログラムを作成しました。これは Windows フォームを使用した C# です。私の目標は、ユーザーのタイプに応じて結果が表示される ERP ソフトウェアの検索機能に似たものにすることです (Google の予測検索機能に似ています)。

私が苦労しているのは、データベースへのクエリの数を減らすことです。現在、ユーザーが少なくとも3文字入力するまでクエリが実行されないようにしています。そうしないと、返される結果が多すぎます。

private void SearchField_TextChanged(object sender, EventArgs e)
{
    string search = SearchField.Text;
    if (search.Length >= 3)
    {
        dataGridView1.DataSource = sql.ExecuteQuery(Query(search));
    }
}

私が追加したいのは、ユーザーが入力を停止するか、何ミリ秒も文字を入力しないまで、クエリの遅延です。私はタイマークラスを見てきましたが、それを適切に実装するために見つけた例に苦労しています。基本的に、コードを次のように変更したいと思います。

private void SearchField_TextChanged(object sender, EventArgs e)
{
    string search = SearchField.Text;
    if (search.Length >= 3 && aTimer.Time > 500)  //500 is milliseconds
    {
        dataGridView1.DataSource = sql.ExecuteQuery(Query(search));
    }
    aTimer.Reset();
}

timer クラスを使用している場合、適切に実装する方法がわかりません。より良い解決策があれば、私もそれを受け入れます。

4

1 に答える 1

3

あなたがしたいことは、ユーザーの入力に応じて保留中のクエリをリセットまたは取り消すことができる一方で、将来のある時点でクエリが発生するようにスケジュールすることです。以下に例を示します。

using System;
using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;

class Form1 : Form
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }

    Timer queryTimer;
    TextBox SearchField;

    public Form1()
    {
        Controls.Add((SearchField = new TextBox { Location = new Point(10, 10) }));
        SearchField.TextChanged += new EventHandler(SearchField_TextChanged);
    }

    void SearchField_TextChanged(object sender, EventArgs e)
    {
        if (SearchField.Text.Length < 3)
            RevokeQueryTimer();
        else
            RestartQueryTimer();
    }

    void RevokeQueryTimer()
    {
        if (queryTimer != null)
        {
            queryTimer.Stop();
            queryTimer.Tick -= queryTimer_Tick;
            queryTimer = null;
        }
    }

    void RestartQueryTimer()
    {
        // Start or reset a pending query
        if (queryTimer == null)
        {
            queryTimer = new Timer { Enabled = true, Interval = 500 };
            queryTimer.Tick += queryTimer_Tick;
        }
        else
        {
            queryTimer.Stop();
            queryTimer.Start();
        }
    }

    void queryTimer_Tick(object sender, EventArgs e)
    {
        // Stop the timer so it doesn't fire again unless rescheduled
        RevokeQueryTimer();

        // Perform the query
        Trace.WriteLine(String.Format("Performing query on text \"{0}\"", SearchField.Text));
    }
}
于 2013-03-14T17:52:34.640 に答える