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的博客-CSDN博客_winform 异步加载窗体

这篇文章,用BeginInvoke去做也可以,都简单。

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐