c#使用BackGroundWorker类更新静态WinForm控件
我有三门课:c#使用BackGroundWorker类更新静态WinForm控件,c#,winforms,datagridview,backgroundworker,C#,Winforms,Datagridview,Backgroundworker,我有三门课: 带有按钮和面板(MyPanel)的表单类(MyForm) BackGroundWorker类(DataGridViewLoader) DataGridView类(MyDataGridView) 我选择三个独立类的原因是为了防止表单类中的代码过多 在我的表单类中,我想启动BackGroundWorker,它应该创建并填充我的DataGridView。一旦完成,它应该将我的DataGridView实例添加到我的面板中 鉴于我仍在学习编码,我有几个问题: 这可能吗 这是最好的还是最优雅的
private void Button_Click(object sender, EventArgs e)
{
DataGridViewLoader worker = new DataGridViewLoader();
worker.RunWorkerAsync();
}
DataGridViewLoader类中的代码:
private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
MyDataGridView myDataGridView = new MyDataGridView();
BindingSource myBindingSource = new BindingSource();
myBindingSource.ResetBindings(true);
myBindingSource.DataSource = MyDataTable;
}
看到MyPanel是静态的,我在发布的其他问题中看到需要使用invoke
private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
MyForm.myPanel.Invoke(new Action(() =>
{
//Add datagridview to my panel.
MyForm.myPanel.Add(myDataGridView);
}));
}
然而,我面临着这个错误:
"An object reference is required for the non-static field, method, or property 'MyForm.myPanel'"
您无法从
BackgroundWorker
访问GUI元素(DataGrid
),因此这是不可能的。但是您得到的编译器错误是另一回事。@jdweng,请参阅-OP在DoWork
处理程序中创建一个DataGrid
。这不行。请在运行BGW之前创建DGV。在DoWork
中,生成一个数据表。将数据表作为DoWorkEventArgs].Result(
e.Result)
的返回。在RunWorkerCompleted
事件中,检查e.Error
和e.Cancelled
,然后将e.Result
(类型对象
)作为数据表
(强制转换),并将其分配给DGV的数据源(或支持绑定源)。在UI线程中引发RunWorkerCompleted
事件,您不需要调用那里的任何内容。不确定什么是静态面板。如果您是指声明为静态的类,则不要。当BGW完成其工作后,您可以将此工作的结果传递给e.Result
属性。此属性的值可以读取为RunWorkerCompleted
事件的值(请参见此处的备注部分)。这同样适用于RunWorkerAsync(Object)
重载,其中传递给该方法的对象成为dowworkeventargs.Arguments
对象。这就是如何将值从UI线程传递到后台线程,反之亦然。您的DataGridViewLoader
是一个BackGroundWorker(DataGridViewLoader worker=new DataGridViewLoader();worker.RunWorkerAsync();
)。此类已初始化,并在按钮中使用。因此,从主UI(STA)线程单击事件处理程序。RunWorkerCompleted
事件始终在调用RunWorkerAsync()
的线程中引发。如果您是从另一个线程运行此表单,那么您犯了一个需要更正的错误。