2015-07-13 54 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