使用BackGroundWorker从另一个表单更新DataGridView

时间:2010-06-01 06:59:23

标签: c# forms datagridview

我有一个表单(LoginForm),它有一个后台工作器监视数据库以查找新条目。

然后我有另一个表单(AdminForm),我需要发出信号,以便在有新数据时更新其数据网格。

我也可以在AdminForm中轮询数据库,但考虑到LoginForm已经在进行一些轮询,这可能代价很高,我只想通知AdminForm用新数据更新DataGridViews。

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

1 个答案:

答案 0 :(得分:2)

您可以让后台工作者信号进度(WorkerReportsProgress属性设置为true,然后调用ReportProgress)。

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

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

修改
使用OnProgressChanged和其他事件,请执行以下操作:

Form1课程中,声明一个像

这样的新事件
public event EventHandler DataChanged;

另外,声明一个引发事件的方法:

protected void OnDataChanged()
{
    if (DataChanged != null)
        DataChanged(this, EventArgs.Empty);
}

然后,在OnProgressChanged方法中,调用OnDataChanged方法。

您现在需要做的就是:

  1. 使用form1.DataChanged += new EventHandler....
  2. 之类的内容将Form2附加到Form1中的事件
  3. 在该事件处理程序中,更新Form2中的控件
  4. 例如,您可以在创建Form1时将Form1的当前实例传递给Form2的构造函数,并将事件处理程序附加到Form2的构造函数中。还有其他选择。

    编辑2
    思考它:为什么不将轮询代码放入一个单独的类中,该类在数据发生变化时提供事件。然后,您可以将Form1和Form2附加到这些事件。这将使Form2独立于Form1。