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