首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用于填充DataGridView的BackgroundWorker

用于填充DataGridView的BackgroundWorker
EN

Stack Overflow用户
提问于 2019-06-19 21:24:25
回答 1查看 670关注 0票数 0

编辑:使用此命令解决:http://reedcopsey.com/2011/11/28/launching-a-wpf-window-in-a-separate-thread-part-1/

在我的项目(.net/windows窗体)中,我用一个大的DataTable填充了一个DataGridView。填充可能需要20秒,所以我想要一个动画加载窗口。如果线程繁忙,这个动画就会冻结,所以我必须为窗口或填充DataGridView使用一个新的线程。

我已经尝试使用BackgroundWorker来显示窗体,但它将是一个形状正确的空白白色窗口。

我也尝试过使用BackgroundWorker填充DataGridView,但它会抛出一个错误,指出DataGridView正被另一个线程访问,而不是为它创建的那个线程。因为DataGridView是在designer类中创建的,所以我不能只在新的线程中创建它-而且这个解决方案听起来不是很优雅。

在填写DataGridView时显示有效的动画表单的最佳方式是什么

编辑:答案没有为我解决这个问题,所以我试着把代码分解成可以在这里展示的东西。我以前没有这样做,因为它似乎没有足够的相关性来处理大约1000行代码。在这里给出的代码中可能遗漏了什么,或者是之前实验中的一些残留物。请忽略函数的错误命名,这是一个遗留的问题,一旦我让它工作,我就会修复它。代码的一部分是古老的。

我已经让它无错误地运行,但frmLoading仍然没有动画(不过,如果我在工作线程不忙的时候让它保持活动状态,它就是动画)。

代码语言:javascript
复制
namespace a
{
    public partial class frmMain : DockContent, IPlugin
    {
        //...
        private delegate void SafeCallDelegate(DataTable dt);
        private Thread thread1 = null;
        private frmLoading frmLoading = new frmLoading();


        public frmMain()
        {
            //...
        }
        //...

        private void FillDataGrid(DataTable dt)
        {
            if(this.InvokeRequired)
            {
                var d = new SafeCallDelegate(FillDataGrid);
                Invoke(d, new object[] { dt });
            }
            else
            {
                //...
                DataGridFiller(dt);
            }
        }

        private void DataGridFiller(DataTable dt)
        {
            BindingSource dataSource = new BindingSource(dt, null);
            //...
            dgvData.DataSource = dataSource;
            //...
            frmLoading.Hide();
        }

        private void btnGetData_Click(object sender, EventArgs e)
        {
            DataTable dt = [...];

            // Wenn Daten vorhanden sind, dann anzeigen
            if (dt != null)
            {
                //...

                frmLoading.Show();
                thread1 = new Thread(() => FillDataGrid(dt));
                thread1.Start();
            }
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2019-06-19 21:31:54

使用显示弹出加载窗口的异步任务,直到DataGridView填满为止。

这里有一个链接指向微软为异步编程而写的文章:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/async/

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56668732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档