2008-11-14 249 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); 
      } 
    } 
}