3

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

假设对象太高而无法放入网格中,因此有一个滚动条。用户选择了一个网格项目,但也向上滚动到它上方,以便所选项目位于控件底部的下方。

问题是在 Refresh() 控件会自动将网格项目滚动到视图中(奇怪的是,当项目高于控件顶部时它不会这样做)。

我正在寻找一种方法来防止这种情况或保存状态,执行 Refresh(),然后将其设置回来。我尝试在 PropertyGrid 内的 PropertyGridView 中获取底层 VScrollBar,并弄乱“值”,但它不会永久设置。总是弹出,所以项目在视图中。

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

有人遇到类似的事情吗?

4

4 回答 4

3

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

于 2008-11-17T19:24:36.740 回答
2

我发现了一个有趣的 hack:

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

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

所以我选择我需要的项目,然后将选择移回

于 2012-08-17T11:23:11.180 回答
1

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

不要分配新对象。

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

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

于 2014-06-18T20:08:50.950 回答
1
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);
           }
     }
}
于 2016-06-26T12:23:45.197 回答