2013-03-14 41 views
1

我剛剛編寫了我的第一個程序,該程序用用戶寫入文本框的信息查詢SQL數據庫。這是使用Windows窗體的C#。我的目標是讓它與我們的ERP軟件中的搜索功能類似,其中結果以用戶類型顯示(類似於Google的預測搜索功能)。C#在用戶鍵入文本框時延遲SQL查詢

我正在努力減少查詢數據庫的數量。現在我有它,這樣查詢纔會執行,直到用戶鍵入至少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(); 
} 

如果使用定時器類,我不知道如何正確地執行它。如果有更好的解決方案,我也會接受。

+0

爲什麼不能有一個「提交」按鈕?當然,你不會有預測結果,但你會限制你的查詢。 – MyCodeSucks 2013-03-14 14:02:19

+0

@BradM OP聲明他的項目是'C#using windows forms' – Seany84 2013-03-14 14:03:20

+0

是的我正計劃在用於搜索數據庫的客戶端窗口應用程序窗體中實現計時器。 – Matt 2013-03-14 14:05:17

回答

1

您想要做的事是安排查詢在將來的某個時間點發生,同時能夠在用戶鍵入時重置或撤銷掛起的查詢。這裏是一個例子:

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)); 
    } 
} 
+0

我剛剛實施了你所說的,它似乎最初工作完美。我只需要弄清楚如何讓用戶停止輸入,然後重新開始或重新開始。此外,您用'Timer queryTimer'初始化計時器的位置我不得不使用'System.Windows.Forms.Timer queryTimer' – Matt 2013-03-14 18:47:27

+0

@Matt如果用戶停下來然後繼續,它會重新開始。該代碼是一個完整的程序。使用調試器中的「輸出」選項卡可見,然後運行它。 – Tergiver 2013-03-14 18:51:28

+0

是的,你的程序在測試後完美運行。在執行您寫入我自己的程序時,我錯過了一行。它是固定的,似乎在工作。謝謝! – Matt 2013-03-14 19:33:59