的Invoke
方法上以相同的方式作为ListBox
的DataGridView
作品。
下面是一个示例,其中DataGridView
最初绑定到BindingList<items>
,我们创建一个新列表并绑定到该列表。这应该等同于您要求将DataTable
从您的电话拨入Oracle并将其设置为DataSource
。
private delegate void SetDGVValueDelegate(BindingList<Something> items);
void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// Some call to your data access infrastructure that returns the list of itmes
// or in your case a datatable goes here, in my code I just create it in memory.
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,像这样的工作列表框经过:
backgroundWorker1.RunWorkerAsync(this.listBox2);
然后你可以施放arguments对象的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!
}
我不想要使用runworker完成,因为我的datagrid代码在背景中。我的backgrounder线程实际上调用另一个想要输出到datagridview的方法。我真的不明白你在做什么?我想调用一个委托方法并将它传递给我希望gridview显示的信息。我不认为你的方法做到了这一点 – hWorld 2011-06-16 13:05:00
@Dominique - 我的方法更新了datagridview,但是有很多这样做的方法,我无法真正给你一个例子来匹配你所需要的,没有更多的信息。如果你不是在后台线程中工作,你可以使用代码来编辑你的问题吗? – 2011-06-16 13:11:52
@Dominique - 你可以做的一个例子就是使用绑定源和调用。 – 2011-06-16 13:14:01