2015-07-13 66 views
0

我有一个存储从usb收集的数据的类。我经常使用背景线程读取数据,睡眠10ms,然后重复。如何在后台更新datagridview

使用List(of T)类将数据绑定到datagridview _mydatagrid中。我不使用BindingList(Of T),因为它会非常频繁地更新数据网格,并会消耗大量的CPU资源。

要更新数据网格中,我使用两种机制:

  • 如果数据的大小增长:

    _mydatagrid.DataSource =无

    _mydatagrid.DataSource =(的实例我的存储数据类)

  • 如果数据大小已达到我要存储的限制:

    我打算

    _mydatagrid.Invalidate()

的代码工作正常,很少的CPU使用率。但有一件令我困扰的事情是,当datagridview更新时,它倾向于将注意力集中到它。因此,如果我打开另一个应用程序,尤其是具有多个窗体窗体的应用程序,datagridview会与另一个应用程序争斗,以便在更新时关注它。因此它弹出很多,并且看起来很有侵略性,而且不是用户友好的。

有没有办法更新datagridview静默。我试着在背景中做到这一点,但我注意到,即使如此,当调用_mydatagridview.Invalidate()_mydatagridview.Refresh()时,无论如何,它都会获得焦点。

有什么建议吗?

+0

你能详细说一下“获取焦点”吗?焦点实际上是否会从其他控件移动到datagridview或datagridview激活的表单中,还是仅仅因为它闪烁而暗示它会吸引眼球? – AaronTheRabbit

回答

0

闪烁可能是由于将数据源设置为无,然后将其设置为新的东西而引起的。 DataGridViews通常会逐行绘制自己,并且可能会分散注意力。

我喜欢使用自定义的datagridview类,它可以启用双缓冲以避免闪烁。您也不必将数据源设置为无,您可以将其直接更改为新的源,并且不必调用无效;设置数据源将导致网格已经重绘。

Public Class CustomDataGridView 
    Inherits DataGridView 

    Public Sub New() 
    Me.SetStyle(ControlStyles.AllPaintingInWmPaint, True) 
    Me.SetStyle(ControlStyles.OptimizedDoubleBuffer, True) 
    End Sub 
End Class 

我不知道你的意思是“获得焦点”,虽然,没有你所说的事情应该引起它偷焦点,所以这可能不会解决你的焦点问题。

+0

谢谢你的回答。我的意思是“获得焦点”是,当我加载另一个应用程序时,它会尝试将控制焦点放在它上面,并阻止其他应用程序加载表单。我可以清楚地看到,如果应用程序有多种形式要加载。如果我将它最小化,那么其他应用程序将会正常加载,而不会与datagridview“打架”。 – user3790971

+0

将尝试您建议的方法,看看它是否有所作为。谢谢。 – user3790971