C# 使用BackGroundWorker从其他表单更新DataGridView

C# 使用BackGroundWorker从其他表单更新DataGridView,c#,forms,datagridview,C#,Forms,Datagridview,我有一个表单(LoginForm),它有一个后台工作人员监视数据库中的新条目 然后我有另一个表单(AdminForm),每当有新数据可用时,我需要向它发送信号以更新它的数据网格 我也可以在AdminForm中轮询数据库,但是考虑到LoginForm已经在做一些轮询,这可能会很昂贵,我只想通知AdminForm使用新数据更新datagridview 您可能会问,在AdminForm中显示内容时,为什么LoginForm要进行轮询?LoginForm实际上是在处理数据并通过串口发送:$heheh。我

我有一个表单(LoginForm),它有一个后台工作人员监视数据库中的新条目

然后我有另一个表单(AdminForm),每当有新数据可用时,我需要向它发送信号以更新它的数据网格

我也可以在AdminForm中轮询数据库,但是考虑到LoginForm已经在做一些轮询,这可能会很昂贵,我只想通知AdminForm使用新数据更新datagridview


您可能会问,在AdminForm中显示内容时,为什么LoginForm要进行轮询?LoginForm实际上是在处理数据并通过串口发送:$heheh。我希望它能够处理数据,而无需管理员一直登录。

您可以让后台工作人员发出进度信号(
WorkerReportsProgress
属性设置为true,然后调用
ReportProgress

在该事件处理程序(
OnProgressChanged
)中,调用您创建的另一个公共事件,该事件向接收方发出应更新数据的信号。您的管理员表单可以订阅该事件

由于我不确定是在主线程的上下文中还是在后台工作线程的上下文中调用了
OnProgressChanged
事件,我建议您在实际执行UI更新时使用
this.Invoke

编辑
使用
OnProgressChanged
和其他事件,执行以下操作:

Form1
类中,声明一个新事件,如

public event EventHandler DataChanged;
另外,声明引发事件的方法:

protected void OnDataChanged()
{
    if (DataChanged != null)
        DataChanged(this, EventArgs.Empty);
}
然后,在
OnProgressChanged
方法中,调用您的
OnDataChanged
方法

您现在需要做的就是:

  • 使用类似于
    Form1.DataChanged+=neweventhandler…
  • 在该事件处理程序中,更新Form2中的控件
  • 例如,您可以在创建Form1的当前实例时将其传递给Form2的构造函数,并在Form2的构造函数中附加事件处理程序。还有其他选择

    编辑2

    思考一下:为什么不将轮询代码放入一个单独的类中,该类在数据更改时提供一个事件。然后可以将Form1和Form2附加到这些事件。这将使Form2独立于Form1。

    ProgressChanged事件在UI线程的上下文中调用。感谢您的提示。下次我得自己试试,但我现在会记得:-)嗯。。。。我的头上有点晕过去了。OnProgressChanged将在Form1的UI线程上运行。。。但从那里访问Form2上的数据网格仍然是非法的。这正是我的问题。我不熟悉.Invoke方法。我将如何将其用于Form2中的数据网格,并从Form1中更新它们?谢谢你的回复!