【问题标题】:Updating DataGridView from another Form using BackGroundWorker使用 BackGroundWorker 从另一个表单更新 DataGridView
【发布时间】:2010-06-01 06:59:23
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# forms datagridview


    【解决方案1】:

    您可以让您的后台工作人员发出进度信号(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 方法。

    你现在需要做的就是:

    1. 使用 form1.DataChanged += new EventHandler.... 之类的东西将 Form2 附加到 Form1 中的事件
    2. 在该事件处理程序中,更新 Form2 中的控件

    例如,您可以在创建 Form1 的当前实例时将其传递给 Form2 的构造函数,并在 Form2 的构造函数中附加事件处理程序。还有其他选择。

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

    【讨论】:

    • ProgressChanged 事件在 UI 线程的上下文中被调用
    • 谢谢你的提示。下次我必须自己尝试一下,但我现在会记得 :-)
    • hmm.... 有一点在我脑海中浮现。 OnProgressChanged 将在 Form1 的 UI 线程上运行……但从那里访问 Form2 上的数据网格仍然是非法的。这正是我的问题。我不熟悉 .Invoke 方法。对于 Form2 中的数据网格,我将如何使用它,从 Form1 更新它们?感谢您的回复!
    猜你喜欢
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    相关资源
    最近更新 更多