我有一个PropertyGrid,其中填充了一个名为Outer的可扩展属性(其中包括许多其他属性) Class Outer包含另一个可扩展属性,称为Inner 我正在尝试初始化我的表单,以便Inner被展开并且Outer被折叠,所以当表单被加载时,我得到:
我 NOT 希望完全覆盖Outer的扩展以自动展开Inner,但只是按照描述设置初始状态。
这是我实施选项#3的方式,如同类似问题的答案所示:
// Suppose I have a reference to the root, in pgRoot
for (int i = 0; i < pgRoot.GridItems.Count; i++)
{
if (pgRoot.GridItems[i].Label == "Outer Display Name")
{
GridItem giOuter = pgRoot.GridItems[i];
giOuter.Expanded = true;
for (int j = 0; j < options.GridItems.Count; j++)
{
if (giOuter.GridItems[j].Label == "Inner Display Name")
{
GridItem giInner = giOuter.GridItems[j];
giInner.Expanded = true;
giOuter.Expanded = false;
break;
}
}
break;
}
}
我不明白为什么设置giOuter.Expanded = false
导致表单加载内部折叠,而上面的场景#1允许 - 在加载表单后 - 折叠外部(通过GUI)而不会弄乱Inner的状态
答案 0 :(得分:0)
调用ExpandAllInnerItems
事件处理程序中的Form.Load
方法。它按预期工作。但是如果你进行表单初始化,那么它将不起作用PropertyGrid
的默认扩展逻辑在Load
期间启动并覆盖自定义扩展逻辑。
private void ExpandAllInnerItems()
{
GridItem root = Root;
IList<GridItem> allItems = GetAllChildGridItems(root);
foreach (GridItem item in allItems)
{
if (item.Parent != root && item.Expandable)
{
item.Expanded = true;
}
else if(item.GridItemType == GridItemType.Category)
{
item.Expanded = false;
}
}
}
private GridItem Root
{
get
{
GridItem aRoot = propertyGrid1.SelectedGridItem;
do
{
aRoot = aRoot.Parent ?? aRoot;
} while (aRoot.Parent != null);
return aRoot;
}
}
private IList<GridItem> GetAllChildGridItems(GridItem theParent)
{
List<GridItem> aGridItems = new List<GridItem>();
foreach (GridItem aItem in theParent.GridItems)
{
aGridItems.Add(aItem);
if (aItem.GridItems.Count > 0)
{
aGridItems.AddRange(GetAllChildGridItems(aItem));
}
}
return aGridItems;
}