1

データベースを照会し、結果を下のボックスに表示する検索ボックスがあります。ontextchangedイベントを使用すると、これは少し遅くなります。新しい文字が書き込まれるたびにデータベースが照会されるためです。

ユーザーが書き込みを終えたとき、またはユーザーが少し休憩するたびにクエリを実行するようにするにはどうすればよいですか?

4

4 に答える 4

2

これに対する私の解決策は、キーが変更されるたびにタイマーを起動することです。テキストが変更された回数を追跡し、タイマーの有効期限が切れた回数と比較します。2つの数値が等しい場合は、メソッドを呼び出します。注:MySearchMethod()は、ユーザーが入力を停止した後に起動するメソッドであり、txtQuickSearchは、ユーザーが入力しているテキストボックスのIDです。

Private mint_LastReceivedTimerID As Integer = 0
Private mint_LastInitializedTimerID As Integer = 0

Private Sub txtQuickSearch_TextChanged(ByVal sender As System.Object, ByVal e As System.Windows.Controls.TextChangedEventArgs) Handles txtQuickSearch.TextChanged
    'Increment the counter for the number of times the textbox has been changed
    mint_LastInitializedTimerID = mint_LastInitializedTimerID + 1

    'Wait longer for shorter strings or strings without spaces
    Dim intMilliseconds As Integer = 500
    If txtQuickSearch.Text.Length >= 6 Then
        intMilliseconds = 250
    End If
    If txtQuickSearch.Text.Contains(" ") = True And txtQuickSearch.Text.EndsWith(" ") = False Then
        intMilliseconds = 175
    End If

    Dim objTimer As New System.Timers.Timer(intMilliseconds)
    AddHandler objTimer.Elapsed, AddressOf txtQuickSearch_TimerElapsed

    objTimer.AutoReset = False
    objTimer.Enabled = True
End Sub

Private Sub txtQuickSearch_TimerElapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs)
    'Increment the counter for the number of times timers have elapsed
    mint_LastReceivedTimerID = mint_LastReceivedTimerID + 1

    'If the total number of textbox changes equals the total number of times timers have elapsed (fire method for only the latest character change)
    If mint_LastReceivedTimerID = mint_LastInitializedTimerID Then
        'Fire method on the Main UI Thread
        Me.Dispatcher.Invoke(Sub() MySearchMethod(), System.Windows.Threading.DispatcherPriority.Normal)
    End If
End Sub
于 2014-03-14T17:08:08.660 に答える
1

おそらく、Timerオブジェクトをたとえば500ms(0.5秒)の間隔で配線し、.onTextChangedイベントが発生したときに開始するようにします。次に、タイマーが「ティック」したときに、そのイベントを使用してDBへのクエリを実行しますか?

于 2012-05-08T13:03:18.507 に答える
1

最も簡単な方法は、最後のOnTextChangedが発生した時間を記録することです。また、現在の時刻がNより大きい場合は、Webサービスを呼び出します。

もう1つの方法は、Nミリ秒ごとに繰り返し時間を開始してから、lastTextでテキストを確認し、等しくない場合はWebサービスを呼び出すことです。これを行う場合は、System.Windows.Form.Timerを使用して、検索ボックスから現在のテキストを取得したときにコールバックがUIで実行されるようにします。

于 2012-05-08T13:07:44.180 に答える
0

これを試して:

Const WaitInterval As Integer = 5   '5 seconds <-- change this to control speed
Dim WithEvents MyTimer As New Timers.Timer

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    MyTimer.Interval = WaitInterval * 1000
    MyTimer.AutoReset = False
End Sub

Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged
    MyTimer.Stop()
    MyTimer.Start()
End Sub

Private Sub MyTimer_Elapsed(sender As Object, e As System.Timers.ElapsedEventArgs) Handles MyTimer.Elapsed

    '' -- call your method to query database here --

End Sub
于 2012-05-09T03:40:13.507 に答える