C# ExpandableObjectConverter作为GridItem-如何在外部GridItem折叠时初始化要展开的内部GridItem?

C# ExpandableObjectConverter作为GridItem-如何在外部GridItem折叠时初始化要展开的内部GridItem?,c#,.net,winforms,propertygrid,C#,.net,Winforms,Propertygrid,我有一个PropertyGrid,其中填充了一个可扩展的属性,称为Outer(以及其他许多属性)。 类外部包含另一个可扩展属性,称为内部。 我试图初始化表单,以便内部展开,外部折叠,以便加载表单时,我得到: Outer在init时折叠,因此其属性不会“污染”视图 单击展开外部将显示内部已展开 我不想完全覆盖外部的扩展以自动扩展内部,但只想设置所述的初始状态 对于外部和内部,将GridItem.Expanded设置为true都有效:在这种情况下,在加载表单后,单击折叠外部不会影响内部的展开状态

我有一个PropertyGrid,其中填充了一个可扩展的属性,称为Outer(以及其他许多属性)。
类外部包含另一个可扩展属性,称为内部。
我试图初始化表单,以便内部展开,外部折叠,以便加载表单时,我得到:

  • Outer在init时折叠,因此其属性不会“污染”视图
  • 单击展开外部将显示内部已展开
我不想完全覆盖外部的扩展以自动扩展内部,但只想设置所述的初始状态

  • 对于外部和内部,将GridItem.Expanded设置为true都有效:在这种情况下,在加载表单后,单击折叠外部不会影响内部的展开状态,因此即使在不可见时也可以保持展开状态
  • 只将内心的设定为真,似乎根本没有效果
  • 将两者设置为true,然后将Outer设置为false,与#2完全相同,只是相当愚蠢
  • 这就是我实施选项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;
        }
    }
    
    //假设我在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()的(我的版本)。工作得很有魅力。我也为接受你的回答太晚而道歉。