2008-11-14 90 views
3

我在工具應用程序中使用PropertyGrid來顯示一個窗口來監視遠程應用程序中的對象。每隔一秒左右,我都會從應用程序獲取更新,並更新任何已更改的成員的狀態,然後更新網格。我調用Refresh()來進行更改。除了一件事之外,這一切都很好。如何防止在PropertyGrid刷新滾動?

說這個物體太高而不適合網格,所以有一個滾動條。用戶已經選擇了一個網格項目,但也在其上方向上滾動,以便所選項目低於該控件的底部。

問題是,在Refresh()控件會自動將網格項滾動到視圖中(奇怪的是,當項在控件頂端之上時,它不會這樣做)。

我正在尋找一種方法來防止這種情況,或保存狀態,執行刷新(),然後將其設置回來。我嘗試在PropertyGrid中的PropertyGridView中獲取底層的VScrollBar,並搞亂了「Value」,但它不會永久保留。始終彈出,以便看到該項目。

在滾動期間取消選擇項目是我的後備(自動滾動到視圖不會發生沒有選定的網格項目),但它傷害了可用性一點,所以我正在尋找另一種方式。

任何人遇到類似的東西?

回答

3

這在MS PropertyGrid中是不可能的。這個組件有太多的不可訪問的內部組件,給你提供你請求的靈活性,並且當你意識到自己不一致時(你在網格下面的屬性有問題,但是當它在上面時沒有問題)。這就是爲什麼我創建了Smart PropertyGrid.Net。如果商業產品是您的選擇,則此網格可以選擇存儲屬性狀態,並在您對網格執行操作(如Refresh())後沒有任何閃爍地恢復它們。

+0

我肯定會以很多方式超越PropertyGrid的限制。 PropertyGridEx讓我非常滿意,但更重要的是,我將不得不考慮商業解決方案。現在跛行...儘管如此,我得到的結果仍然是.NET團隊的證明!耶重用! – scobi 2008-11-17 19:32:56

1

I`ve發現了一個有趣的黑客:

您可以手動選擇您更改網格項目,他們將刷新:)

var panProp = categ.GridItems[3]; 
var tiltProp = categ.GridItems[4]; 
panProp.Select(); 
tiltProp.Select(); 

所以我選擇我需要的項目,不是移動選擇回

1

對我來說,下面做了區別:

不分配一個新的對象。

只需用新數據更新舊對象的字段。

現在,刷新後,我的PropertyGrid不再滾動,並且還顯示更新的內容。

0
public void SoftRefreshPropertyGrid() 
{ 
    var peMain = propertyGrid.GetType().GetField("peMain", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(propertyGrid)as System.Windows.Forms.GridItem; 
    if (peMain != null) 
    { 
      var refreshMethod = peMain.GetType().GetMethod("Refresh"); 
      if (refreshMethod != null) 
      { 
        refreshMethod.Invoke(peMain, null); 
        propertyGrid.Invalidate(true); 
      } 
    } 
}