我在工具应用程序中使用PropertyGrid来显示一个窗口来监视远程应用程序中的对象。每隔一秒左右,我从应用程序获得更新,其中包含已更改的任何成员的状态,并更新网格。我调用Refresh()来进行更改。除了一件事,这一切都很有效。

假设物体太高而无法放入网格中,因此有一个滚动条。用户已选择了一个网格项,但也在其上方滚动,以便所选项位于控件的底部下方。

问题是,在Refresh()上,控件会自动将网格项目滚动到视图中(奇怪的是,当项目位于控件顶部时,它不会执行此操作。)

我正在寻找一种方法来阻止这种情况,或者保存状态,执行Refresh(),然后将其设置回来。我尝试在PropertyGrid中的PropertyGridView中获取底层的VScrollBar,并弄乱<!> quot; Value <!>“;但它不会保持永久设置。始终弹出以使项目处于可见状态。

在滚动期间取消选择项目是我的后备(自动滚动到视图不会发生没有选定的网格项目)但它会损害可用性,所以我正在寻找另一种方式。

有人碰到类似的东西吗?

有帮助吗?

解决方案

这在MS PropertyGrid中是不可能的。这个组件有太多无法访问的内部组件,为您提供了所请求的灵活性,并且您意识到自己并不一致(您在网格下面有一个属性但在上面时没有这个问题)。这就是我创建 Smart PropertyGrid.Net 的原因。如果您可以选择商业产品,则此网格可以选择存储属性状态,并在您对网格执行操作后恢复它们(如Refresh()),而不会出现任何闪烁。

其他提示

我发现了一个有趣的黑客:

您可以手动选择您更改的网格项,它们将刷新:)

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

所以我选择了我需要的物品,然后再将选择移回

对我来说,以下方面有所不同:

不要指定新对象。

只需使用新数据更新旧对象的字段。

现在,在刷新时,我的PropertyGrid不再滚动,并且还显示更新的内容。

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);
           }
     }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top