2 つの提案があります。
TextChange イベントの代わりに "TextBox enter KeyPressdown" イベントを処理して、クエリを入力した後に "Return" キーが押されたときにのみイベントがトリガーされるようにします。サンプルコードは次のようになります。
private void searchTextBox_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Return)
{
// DoQueryAndRebindEmployees(searchTextBox.Text);
}
}
TextChange イベントで処理する必要がある場合は、データベース検索コードを別のスレッド (BackgroundWorker スレッドなど) に配置します。 TextChange イベント ハンドラーで:
BackgroundWorker employeeQueryWorker = new BackgroundWorker();
employeeQueryWorker.DoWork += new DoWorkEventHandler(employeeQueryWorker_DoWork);
employeeQueryWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(employeeQueryWorker_RunWorkerCompleted);
employeeQueryWorker.RunWorkerAsync(searchTextBox.Text);
バックグラウンドワーク スレッドと UI スレッドの間で通信するには、クラスのメンバー変数を定義して、次のように従業員のクエリ結果を表すことができます。
private IList<Employee> m_employeeQueryResult = null;
次に、employeeQueryWorker_DoWork(object sender, DoWorkEventArgs e) スレッド メソッドで、時間のかかるデータベース クエリを実行し、クエリ結果を m_employeeQueryResult に格納します。
最後に、employeeQueryWorker_RunWorkerCompleted() メソッドで、m_employeeQueryResult を DataGridView コントロールにバインドします。
これにより、UI コントロールの応答性が維持されます。