我有一個應用程序在窗體上有兩個DataGridView控件。網格排列在一起,都處於虛擬模式,並且行需要保持一致。其中一個網格位於控件中,該控件公開FirstDisplayedScrollingRowIndex屬性和滾動事件。我如何使虛擬模式下的.net DataGridView控件快速重繪時滾動
當其中一個網格滾動時,其他網格FirstDisplayedScrollingRowIndex屬性設置爲保持對齊。
雙緩衝已被設置爲使用真:
dataGridViewLines.GetType.InvokeMember("DoubleBuffered", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.SetProperty, Nothing, dgvStoreLines, New Object() {True})
該應用程序最初是寫在VS2005和已經升級在VB中vs2012,但很高興有在C#中的答案。
當其中任一控件設置其他控件FirstDisplayedScrollingRowIndex屬性時,會設置一個標誌,以確保第二個控件滾動事件不會返回到導致循環事件的容器。
第一格有大約50列,第二格有8-10。網格中通常有大約250-350行數據。
問題是,當使用鼠標滾輪滾動其中一個網格時,在第二個網格中的數據與第一個網格一致移動之前,即使滾動條保持完全一致,您也會有一點滯後。如果您用鼠標抓住滾動條向上或向下移動滾動條,則另一個網格上的滾動條將完美移動,但網格數據不會更改,直到滾動條被釋放。
如果刪除使它們保持對齊的代碼,則單獨按照預期方式滾動每個網格。
由於性能原因,CellValueNeeded過程中有些語句被細分爲小的select語句。
沿線的我曾嘗試代碼:
dgv.SuspendLayout()
dgv.Refresh() ' have also tried dgv.PerformLayout()
dgv.ResumeLayout()
目前以下粗略代碼似乎提供了更好的結果比任何刷新或PerformLayout。
For i As Integer = 0 To dgv.ColumnCount - 1
If dgv.Columns(i).Visible AndAlso dgv.Columns(i).Displayed Then
dgv.InvalidateColumn(i)
End If
Next
下面的代碼重新錯誤到一定量 - 這試圖表明大多數正在設置的屬性 - 我不能發佈任何實際的代碼。創建我已經添加到datagridview控件的應用程序,並將它們錨定到表單邊緣。第二個網格添加了一個DataGridViewComboBoxColumn列 - 沒有屬性更改,六個值添加到列表A-F。
Private IsSettingDataGridView1RowIndex As Boolean = False
Private IsSettingDataGridView2RowIndex As Boolean = False
Private ReadOnlyColour As System.Drawing.Color = Color.FromArgb(255, 255, 255, 192)
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
For grid1columns As Integer = 0 To 50
DataGridView1.Columns.Add("Column " + grid1columns.ToString, "Column " + grid1columns.ToString)
DataGridView1.Columns(grid1columns).AutoSizeMode = DataGridViewAutoSizeColumnMode.None
Next
For grid1columns As Integer = 0 To 10
DataGridView2.Columns.Add("Column " + grid1columns.ToString, "Column " + grid1columns.ToString)
DataGridView1.Columns(grid1columns).AutoSizeMode = DataGridViewAutoSizeColumnMode.None
Next
PrepGrid(DataGridView1)
PrepGrid(DataGridView2)
End Sub
Private Sub PrepGrid(dgv As DataGridView)
dgv.VirtualMode = True
dgv.RowCount = 300
dgv.AllowUserToAddRows = False
dgv.AllowUserToResizeRows = False
dgv.ColumnHeadersDefaultCellStyle.WrapMode = DataGridViewTriState.True
dgv.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing
dgv.DefaultCellStyle.WrapMode = DataGridViewTriState.False
dgv.EditMode = DataGridViewEditMode.EditOnKeystroke
dgv.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing
dgv.ShowCellToolTips = False
dgv.StandardTab = True
dgv.RowHeadersVisible = False
dgv.ScrollBars = ScrollBars.Vertical
End Sub
Private Sub DataGridView1_CellValueNeeded(sender As Object, e As DataGridViewCellValueEventArgs) Handles DataGridView1.CellValueNeeded
e.Value = String.Format("val r{0} c{1}", e.RowIndex, e.ColumnIndex)
End Sub
Private Sub DataGridView2_CellValueNeeded(sender As Object, e As DataGridViewCellValueEventArgs) Handles DataGridView2.CellValueNeeded
If e.ColumnIndex > 0 Then e.Value = String.Format("val r{0} c{1}", e.RowIndex, e.ColumnIndex)
DataGridView2.Rows(e.RowIndex).Cells(e.ColumnIndex).ReadOnly = (e.ColumnIndex < 2)
If e.ColumnIndex < 2 Then DataGridView2.Rows(e.RowIndex).Cells(e.ColumnIndex).Style.BackColor = ReadOnlyColour
End Sub
Private Sub DataGridView1_Scroll(sender As Object, e As ScrollEventArgs) Handles DataGridView1.Scroll
If Not IsSettingDataGridView2RowIndex Then
IsSettingDataGridView2RowIndex = True
DataGridView2.FirstDisplayedScrollingRowIndex = DataGridView1.FirstDisplayedScrollingRowIndex
IsSettingDataGridView2RowIndex = False
End If
End Sub
Private Sub DataGridView2_Scroll(sender As Object, e As ScrollEventArgs) Handles DataGridView2.Scroll
If Not IsSettingDataGridView1RowIndex Then
IsSettingDataGridView1RowIndex = True
DataGridView1.FirstDisplayedScrollingRowIndex = DataGridView2.FirstDisplayedScrollingRowIndex
IsSettingDataGridView1RowIndex = False
End If
End Sub
在升級到VS 2012之前完成此工作嗎? –
另外:這裏有人有類似的問題:http://stackoverflow.com/questions/8260167/datagridview-virtual-mode-and-lags?rq=1 –
它只是在過去的幾個用戶羣提出幾周,因此2012年至少會有5個版本。我們正試圖查看是否可以將錯誤與特定版本相關聯。同時出現了許多環境變化,包括用戶使用更大的顯示器獲得新PC。當顯示很多行時,它似乎更像是一個問題。 – Matt