2013-10-16 100 views
0

我正在製作一個.NET 4 WinForms應用程序,它從數據庫讀取數據並在DGV中顯示行。但是行數大於一次可以放入屏幕的最大行數。要顯示所有數據,我需要自動滾動DGV直到最後一行,然後更新數據源以刷新DGV。每個像素滾動DataGridView

我發現它很容易做到這一點,只需通過一個遞增FirstDisplayedScrollingRowIndex。 但是滾動太尖銳。我希望它能順利滾動。

爲了做到這一點,我已經打過電話直接ScrollRows方法。這種方法是不公開的,所以我不得不使用反射像這樣:

var scrollRows = dgv.GetType().GetMethod("ScrollRows", BindingFlags.Instance | BindingFlags.NonPublic); 
scrollRows.Invoke(dgv, new object[] { 1, -1, ScrollEventType.SmallIncrement }); 

我打電話從timer_Tick方法,其觸發每20毫秒這段代碼。

的DGV滾動順暢,但它並沒有得出下面那些人看見在開始任何行。

有沒有什麼辦法可以讓它順利滾動並正確顯示數據?

+0

你試過在滾動後調用'Invalidate()'嗎? –

+0

@KingKing只是做了,'dgv.Invalidate()'的行爲一樣'dgv.Refresh()'會,重置垂直滾動偏移量爲0。 –

+0

很難平滑滾動'DataGridView',這不是因爲'ScrollBars',這是因爲** DataGridView呈現其單元格**,通常我們不需要這種平滑的滾動,但我同意在某些情況下需要它。 –

回答

0

我已經下降了DGV,因此對這種做法的必要性。我創建了一個FlowLayoutPanel,其中動態創建面板以顯示所需的數據,並按照我希望的方式進行設計。

有可能執行的DataGridView這可以通過分析DataGridView的代碼.NET反射來實現的平滑滾動的方式,但同樣,我發現了一個可以接受的選擇,我使用它。

有通過實際把它放在一個滾動面板上完成DGV的平滑滾動的方式。這樣,滾動面板也會滾動DGV。這種方式對我來說並不方便,因爲DGV標題會滾出屏幕,並且我需要它們始終可見。

0

您需要將您的DGV添加到面板