【问题标题】:Thread don't reload DataGridView线程不重新加载 DataGridView
【发布时间】:2015-02-16 17:50:47
【问题描述】:

我有一个应该由线程重新加载的 DataGridView。但是当线程执行时,DataGridView 会闪烁并且不加载更改。

有趣的是,如果我在线程上尝试代码而不在线程上(在主线程上执行),DataGridView 重新加载正常!

这是我的代码:

 public void reloadClients(object source, EventArgs e)
            {
                //Console.WriteLine("Clients will reload.");
                dgvClientes.DataSource = null;
                loadReloadClients = new Thread(new ThreadStart(jobReloadAllClients));
                loadReloadClients.Start();
            }

            private void jobReloadAllClients()
            {
                this.Invoke((MethodInvoker)delegate
                {             
                    descricaoCliente.Text = "CARREGANDO TODOS OS CLIENTES";      
                });

                System.Windows.Forms.BindingSource bs = new BindingSource();
                bs.DataSource = clientes.allClients().Tables["Clientes"];


                this.Invoke((MethodInvoker)delegate
                {
                    descricaoCliente.Text = "Todos os Clientes";
                    dgvClientes.DataSource = bs;
                    dgvClientes.Refresh();

                });

            }

编辑

正如我被告知在主线程上设置绑定数据源并在后台线程上加载 BD 数据.... Sievajet 这就是我目前得到的..

System.Windows.Forms.BindingSource bs;
    public void reloadClients(object source, EventArgs e)
    {
        //Console.WriteLine("Clients will reload.");
        dgvClientes.DataSource = null;
        bs = new BindingSource();
        dgvClientes.DataSource = bs;
        loadReloadClients = new Thread(new ThreadStart(jobReloadAllClients));
        loadReloadClients.Start();
    }

    private void jobReloadAllClients()
    {
        this.Invoke((MethodInvoker)delegate
        {             
            descricaoCliente.Text = "CARREGANDO TODOS OS CLIENTES";      
        });

        DataSet Setter = clientes.allClients();        
        this.Invoke((MethodInvoker)delegate
        {
            bs.DataSource = Setter.Tables["Clientes"];
            descricaoCliente.Text = "Todos os Clientes";
            //dgvClientes.DataSource = bs;
            //dgvClientes.Refresh();

        });

    }

【问题讨论】:

  • 在主线程上创建并使用一个绑定源
  • 如何加载clientes.allClients().Tables["Clientes"];进入绑定源? clientes.allClients().Tables["Clientes"];这是什么消耗时间
  • 在线程中加载数据表并用invoke方法分配bindingsource.datasource
  • 不起作用...我将 bindingSource 作为全局变量,在线程中加载数据表并使用 evoke 方法分配 bindingsource.datasource 并且没有结果 =(
  • 发布你所拥有的

标签: c# multithreading datagridview


【解决方案1】:

我做到了...出于某种原因,我不得不释放变量 bs,然后再次对其进行初始化...现在它可以正常工作了。

System.Windows.Forms.BindingSource bs;
    public void reloadClients(object source, EventArgs e)
    {
        //Console.WriteLine("Clients will reload.");
        bs = null;
        dgvClientes.DataSource = null;
        bs = new BindingSource();
        dgvClientes.DataSource = bs;
        loadReloadClients = new Thread(new ThreadStart(jobReloadAllClients));
        loadReloadClients.Start();
    }

    private void jobReloadAllClients()
    {
        this.Invoke((MethodInvoker)delegate
        {             
            descricaoCliente.Text = "CARREGANDO TODOS OS CLIENTES";      
        });

        DataSet Setter = clientes.allClients();        
        this.Invoke((MethodInvoker)delegate
        {
            bs.DataSource = Setter.Tables["Clientes"];
            descricaoCliente.Text = "Todos os Clientes";


        });

    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 2013-11-04
    相关资源
    最近更新 更多