DataGridView
的
Invoke
方法与
ListBox
相同。以下是一个示例,其中
DataGridView
最初绑定到一个
BindingList<items>
,我们创建了一个新列表并将其绑定到该列表。这应该等价于您从 Oracle 调用中获取
DataTable
并将其设置为
DataSource
的要求。请保留 HTML 标签。
private delegate void SetDGVValueDelegate(BindingList<Something> items);
void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BindingList<Something> items = new BindingList<Something>();
items.Add(new Something() { Name = "does" });
items.Add(new Something() { Name = "this" });
items.Add(new Something() { Name = "work?" });
SetDGVValue(BindingList<Something> items)
}
private void SetDGVValue(BindingList<Something> items)
{
if (dataGridView1.InvokeRequired)
{
dataGridView1.Invoke(new SetDGVValueDelegate(SetDGVValue), items);
}
else
{
dataGridView1.DataSource = items;
}
}
在我的测试代码中,成功地使用DataGridView
,将该数据源设置为在DoWork事件处理程序中生成的数据源。
您还可以使用RunWorkerCompleted
回调,因为它被马歇尔到UI线程。以下是一个示例:
backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
dataGridView1[0, 0].Value = "Will this work?";
}
关于你问题的第二部分,有几种方法可以实现。最明显的是在调用 BackGroundWork 时传入你想要操作的 ListBox,如下所示:
backgroundWorker1.RunWorkerAsync(this.listBox2);
然后,您可以在DoWork事件处理程序中转换参数对象:
void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
ListBox l = e.Argument as ListBox;
// And now l is whichever listbox you passed in
// be careful to call invoke on it though, since you still have thread issues!
}