设置时PropertyGrid滚动位置不变

时间:2019-02-27 21:07:53

标签: c# .net windows winforms propertygrid

我在Windows Forms应用程序中有一个PropertyGrid。每当其SelectedObject发生变化时,它就会将其VerticalScroll的值重置为0。下面的代码似乎没有执行任何操作。我尝试了PerformLayout和其他许多解决方案,但均未成功。有什么想法吗?

int pos = MyGrid.VerticalScroll.Value;
MyGrid.SelectedObject = SomeDifferentObject;
MyGrid.VerticalScroll.Value = pos;

1 个答案:

答案 0 :(得分:2)

VerticalScroll属性与PropertyGrid类无关。它引用了 VScrollBar 控件的内部属性。 Scroll事件永远不会发生。
VScrollBar System.Windows.Forms.PropertyGridInternal.PropertyGridView 控件的子级,该类不可直接访问。

您仍然可以获取它,将PropertyGrid转换为Control或忽略PropertyGrid的Browsable(false)属性的Controls属性,然后找到VScrollBar子级,存储当前值,然后再次设置更改SelectedObject属性后。
请注意,此新控件可以具有与以前不同的属性数量,滚动条将被设置为之前的位置。
要更精确地设置 ,您可以获取设置新SelectedObject之前和之后显示的属性数量,并执行 relative 滚动。

在这里,我通过{strong> PropertyGridView 找到了AccessibilityObject.Role,也可以通过其Text(AccessibleRole.Table找到它。 ):

"PropertyGridView"

如果需要(如前所述),将滚动条重新放置在相同的相对位置,则代码可能变为:

var vScroll = propertyGrid1.Controls.OfType<Control>()
                           .Where(ctl => ctl.AccessibilityObject.Role == AccessibleRole.Table)
                           .First().Controls.OfType<VScrollBar>().First();
var vScrollValue = vScroll.Value;
propertyGrid1.SelectedObject = [Some Other Object];
vScroll.Value = vScrollValue;