Winform的ComboBox控件实现异步加载弹窗并搜索

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去做也可以,都简单。

在Windows Form应用程序中,如果你需要异步加载窗体或窗口控件,以提高用户体验,可以使用BackgroundWorker组件或者Task Parallel Library (TPL)。以下是两种常见的方法: 1. 使用BackgroundWorker: - 创建一个BackgroundWorker实例。 - 设置DoWork事件处理程序,在这里处理实际的数据获取或文件读取等耗时操作。 - 当操作开始时,设置WorkerSupportsCancellation属性并启动worker.RunWorkerAsync()。 - 在ProgressChanged事件中提供进度反馈,如果需要。 - 在RunWorkerCompleted事件中完成操作并更新UI。 ```csharp private void btnLoad_Click(object sender, EventArgs e) { BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += Worker_DoWork; worker.ProgressChanged += Worker_ProgressChanged; worker.RunWorkerCompleted += Worker_RunWorkerCompleted; // 开始异步任务 worker.RunWorkerAsync(); } private void Worker_DoWork(object sender, DoWorkEventArgs e) { // 异步加载逻辑... } private void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e) { progressBar.Value = e.ProgressPercentage; // 更新进度条 } private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { if (e.Error != null) { MessageBox.Show("加载失败: " + e.Error.Message); } else { // 加载完成后更新UI或其他操作 } } ``` 2. 使用Task或Task Parallel Library: - 使用Task.Run()方法将耗时操作包装在一个单独的任务中。 - 然后你可以使用await关键字等待任务完成。 ```csharp private async void btnLoad_Click(object sender, EventArgs e) { await Task.Run(() => { // 异步加载逻辑... // 在这里处理数据获取、网络请求等 }); // 加载完成后的UI更新 UpdateFormContent(); } private void UpdateFormContent() { // UI更新代码... } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值