combobox控件搜索功能相信有不少人做过,那么异步如何做呢?
/// <summary>
/// combobox搜索功能
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="cb">控件</param>
/// <param name="valueMember">绑定value</param>
/// <param name="displayMember">绑定显示值</param>
/// <param name="func"></param>
public async Task ComboBoxSearchText<T>(ComboBox cb, string valueMember, string displayMember, Func<string, IEnumerable<T>> func) where T : class, new()
{
if (func == null)
return;
Cursor = Cursors.Default; //保持鼠标指针原来状态,有时候鼠标指针会被下拉框覆盖,所以要进行一次设置
string search = cb.Text.Trim(); //获取cb_material控件输入内
//清空combobox
cb.DataSource = null;
cb.Items.Clear();
cb.ValueMember = valueMember;
cb.DisplayMember = displayMember;
using (FmLoading fl = new FmLoading())
{
var dataTemp = ((Func<string, FmLoading, Task<IEnumerable<T>>>)(async (string txt, FmLoading f) =>
{
var result = await Task.Run(() =>
{
Thread.Sleep(500);
return func(txt);
});
f.Close();
return result;
})).Invoke(search, fl);
fl.ShowDialog();
cb.DataSource = (await dataTemp).ToList();
}
//设置光标位置,若不设置:光标位置始终保持在第一列,造成输入关键词的倒序排列
cb.SelectionStart = cb.Text.Length; // 设置光标位置,若不设置:光标位置始终保持在第一列,造成输入关键词的倒序排列
//cb.Cursor = Cursors.Default; //保持鼠标指针原来状态,有时候鼠标指针会被下拉框覆盖,所以要进行一次设置
cb.DroppedDown = true; // 自动弹出下拉框
cb.MaxDropDownItems = 8; // 拉框最大数目
}
调用如下:
效果
需要源码私聊
如果低版本的异步加载不支持async/await的话就看看
Winform异步加载数据弹窗等待效果_游子吟i的博客-优快云博客_winform 异步加载窗体
这篇文章,用BeginInvoke去做也可以,都简单。