【发布时间】: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