2016-07-04 3 views
-2

TextChangedイベントを使用して、テキストボックスのキーストロークに反応するWinFormsアプリケーションがあります。私は最後のキーストロークから短いギャップ(多分300ミリ秒)があるまで反応を遅らせたい。以下は私の現在のコードは次のとおりです。遅延がTextChangedイベントに反応する

private void TimerElapsed(Object obj) 
{ 
    if (textSearchString.Focused) 
    { //this code throws exception 
     populateGrid(); 
     textTimer.Dispose(); 
     textTimer = null; 
    } 
} 

private void textSearchString_TextChanged(object sender, EventArgs e) 
{ 
    if (textTimer != null) 
    { 
     textTimer.Dispose(); 
     textTimer = null; 
    } 
    textTimer = new System.Threading.Timer(TimerElapsed, null, 1000, 1000); 
} 

私の問題はtextSearchString.FocusedSystem.InvalidOperationExceptionを投げるということです。

私には何が欠けていますか?

+2

'System.Threading.Timer'が実行これを試しますバックグラウンドスレッドでUI要素にアクセスするには、呼び出すか、代わりに 'System.Windows.Forms.Timer'を使用する必要があります。 - また、実際のエラーメッセージ_を質問に含めることをお勧めします。例外にはエラーメッセージが含まれる可能性があります。したがって、例外タイプのみを通知すると、実際の問題を見るのがずっと難しくなります。 –

答えて

2

UI要素にアクセスするために、あなたは呼び出しを実行するか、代わりにSystem.Windows.Forms.Timerを使用しなければならないことを意味し、バックグラウンドスレッド、上System.Threading.Timer実行されます。

System.Windows.Forms.Timerソリューションは、これが最も簡単な方法です。タイマーを配置し、再初期化する必要はありません、ただ、フォームのコンストラクタでそれを初期化し、Start()Stop()メソッドを使用しません:

System.Windows.Forms.Timer textTimer; 

public Form1() //The form constructor. 
{ 
    InitializeComponent(); 
    textTimer = new System.Windows.Forms.Timer(); 
    textTimer.Interval = 300; 
    textTimer.Tick += new EventHandler(textTimer_Tick); 
} 

private void textTimer_Tick(Object sender, EventArgs e) 
{ 
    if (textSearchString.Focused) { 
     populateGrid(); 
     textTimer.Stop(); //No disposing required, just stop the timer. 
    } 
} 

private void textSearchString_TextChanged(object sender, EventArgs e) 
{ 
    textTimer.Start(); 
} 
+0

OnLoadメソッドをオーバーライドすると、「イベントに正しく購読する」問題が回避されるか、フォームのコンストラクタを使用するだけです。 – LarsTech

+0

@LarsTech:True ...更新されました。 –

0

を...

private async void textSearchString_TextChanged(object sender, EventArgs e) 
{ 
    await Task.Delay(300); 
    //more code 
} 
関連する問題