C# ExpandableObjectConverter作为GridItem-如何在外部GridItem折叠时初始化要展开的内部GridItem?
我有一个PropertyGrid,其中填充了一个可扩展的属性,称为Outer(以及其他许多属性)。C# ExpandableObjectConverter作为GridItem-如何在外部GridItem折叠时初始化要展开的内部GridItem?,c#,.net,winforms,propertygrid,C#,.net,Winforms,Propertygrid,我有一个PropertyGrid,其中填充了一个可扩展的属性,称为Outer(以及其他许多属性)。 类外部包含另一个可扩展属性,称为内部。 我试图初始化表单,以便内部展开,外部折叠,以便加载表单时,我得到: Outer在init时折叠,因此其属性不会“污染”视图 单击展开外部将显示内部已展开 我不想完全覆盖外部的扩展以自动扩展内部,但只想设置所述的初始状态 对于外部和内部,将GridItem.Expanded设置为true都有效:在这种情况下,在加载表单后,单击折叠外部不会影响内部的展开状态
类外部包含另一个可扩展属性,称为内部。
我试图初始化表单,以便内部展开,外部折叠,以便加载表单时,我得到:
- Outer在init时折叠,因此其属性不会“污染”视图李>
- 单击展开外部将显示内部已展开李>
// 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;
}
}
//假设我在pgRoot中有一个对根的引用
对于(int i=0;i
我不明白为什么设置
giOuter.Expanded=false
会导致表单加载内部折叠,而上面的场景#1允许在加载表单后(通过GUI)折叠外部,而不影响内部状态。调用表单.load
事件处理程序中的expandAllinerItems
方法。正如你所期望的那样。但是,如果您将表单初始化放入表单,那么它将无法工作,因为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;
}
private void expandAllinerItems()
{
GridItem根=根;
IList allItems=GetAllChildGridItems(根);
foreach(所有项目中的GridItem)
{
if(item.Parent!=根目录和item.Expandable)
{
item.Expanded=true;
}
else if(item.GridItemType==GridItemType.Category)
{
item.Expanded=false;
}
}
}
私有GridItem根
{
得到
{
GridItem aRoot=propertyGrid1.SelectedGridItem;
做
{
aRoot=aRoot.Parent??aRoot;
}while(aRoot.Parent!=null);
返回aRoot;
}
}
私有IList GetAllChildGridItems(GridItem theParent)
{
List aGridItems=新列表();
foreach(parent.GridItems中的GridItem aItem)
{
添加(aItem);
如果(aItem.GridItems.Count>0)
{
AddRange(GetAllChildGridItems(aItem));
}
}
回归农业;
}
谢谢!我重写了Form.OnLoad(),并调用了ExpandAllinerItems()的(我的版本)。工作得很有魅力。我也为接受你的回答太晚而道歉。