Nor*_*man 3 c# data-binding datagridview backgroundworker
我有一个与ui线程一起运行的后台程序线程.现在在backgrounder_doWork方法中,我有一个数据表,我正在从数据库添加信息.我希望它绑定到ui线程中的datagridview以显示给用户.因此,当dataTable使用来自数据库的新信息进行更新时,datagridview应自动刷新以添加/减去从后台线程收到的任何新行信息.我怎样才能做到这一点?我试过这个:
private delegate void dGValueDelegate();
private void dGVValue()
{
BindingSource bSource = new BindingSource();
dtFailures.DataSource = bSource;
bSource.DataSource = dt;
}
Run Code Online (Sandbox Code Playgroud)
其中dt是类级变量.在backgrounder_dowork方法内部,在开始时我调用dGVVAlue方法然后在后台信息被添加到后台线程中的数据表中.然而,datagridview不会显示......
Dav*_*all 10
以下代码应该适合您:
private delegate void SetDGVValueDelegate(BindingList<Something> items);
void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// Some call to your data access layer to get dt
SetDGVValue(DataTable dt)
}
private void SetDGVValue(DataTable dt)
{
if (dataGridView1.InvokeRequired)
{
dataGridView1.Invoke(new SetDGVValueDelegate(SetDGVValue), dt);
}
else
{
dataGridView1.DataSource = dt;
}
}
Run Code Online (Sandbox Code Playgroud)
在你的问题中,你提到使用BindingSource,它没有Invoke方法 - 如果你有一个绑定源,你可以改为在表单上调用:
// On the form
public void SetBindingSourceDataSource(object newDataSource)
{
if (InvokeRequired)
Invoke(new Action<object>(SetBindingSourceDataSource), newDataSource);
else
this.bindingSource.DataSource = newDataSource;
}
Run Code Online (Sandbox Code Playgroud)
您也可以使用Lamda表达式在一行中执行此操作:
void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// Some call to your data access layer to get dt
dataGridView1.Invoke((Action)(() => dataGridView1.DataSource = dt));
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21916 次 |
| 最近记录: |