Google の AutoSuggest 検索テキスト ボックスと同様に、一致する項目のリストをデータベースに送信する WinForm オートコンプリート テキストボックスの良い例を探しています。
たとえば、ユーザーが非常に速く入力する場合、キーストロークごとに 1 つのデータベース検索を送信する必要はありませんが、結果を取得した後、ユーザーが検索されていない追加のキーストロークをキューに入れている場合は、別の検索を実行します。
アップデート:
例えば、
以前に WinForm アプリでマルチスレッドを実行したことはありませんでしたが、検索テキスト ボックスの内容が変更されるたびに新しいスレッドを開始し、データベースに一致するクエリを実行すると思いました。結果が返されるまでにテキストボックスが変更された場合、クエリの結果は無視されます。
ただし、次のエラーが発生します。
Cross-thread operation not valid: Control accessed from a thread other than the thread it was created o
これが私のコードです:
private void txtSearch_TextChanged(object sender, EventArgs e)
{
Thread newThread = new Thread(BeginSourceThread);
newThread.Start(txtSearch.Text);
}
private void BeginSourceThread(object value)
{
string searchText = (string)value;
AutoCompleteStringCollection autoCompleteItems = new AutoCompleteStringCollection();
DataSet ds = MetaData.GetMatchingDatabaseObjects(txtSearch.Text, sqlConnectionStringBuilder.ConnectionString);
DataTable dtbObjects = ds.Tables[0];
if (txtSearch.Text != searchText)
{
return;
}
foreach (DataRow row in dtbObjects.Rows)
{
autoCompleteItems.Add(row["ObjectName"].ToString());
}
txtSearch.AutoCompleteCustomSource = autoCompleteItems;
System.Diagnostics.Debug.WriteLine("Done Returning " + autoCompleteItems.Count.ToString() + " items.");
}
}