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

时间:2013-12-03 12:46:12

标签: c# .net winforms propertygrid

我有一个PropertyGrid,其中填充了一个名为Outer的可扩展属性(其中包括许多其他属性) Class Outer包含另一个可扩展属性,称为Inner 我正在尝试初始化我的表单,以便Inner被展开并且Outer被折叠,所以当表单被加载时,我得到:

  • 外部在init处折叠,因此其属性不会“污染”视图。
  • 点击展开Outer将显示Inner已展开。

NOT 希望完全覆盖Outer的扩展以自动展开Inner,但只是按照描述设置初始状态。

  1. 将外部和内部的GridItem.Expanded设置为true,有效:在这种情况下,在加载表单后,单击以折叠外部不会影响内部的展开状态,因此即使不可见,它也可以保持展开状态。
  2. 只将Inner的设置为true,似乎根本没有效果。
  3. 将两者都设置为true,然后将Outer设置为false,与#2完全相同,只是非常愚蠢。
  4. 这是我实施选项#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的状态

1 个答案:

答案 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;
}