使用C#中的PropertyGrid和CollectionEditor编辑List <object>,其中“对象”包含其他对象

时间:2018-09-18 17:01:13

标签: c# reflection propertygrid collectioneditor

我有一个程序,其中上传了包含各种对象的DLL。上传后,我会创建每种类型的实例并将其保存到Treeview中(这些对象内部可能包含其他对象)。 该程序的目的是编辑这些对象,因此我有一个propertyGrid,它允许我在Treeview中编辑选定的对象。 这几乎适用于几乎所有对象。我只是在编辑具有类型为xObjectType列表的属性的对象时遇到问题,并且此xObjectType具有yObjectType作为属性: 例如,这些类在DLL中定义,我必须编辑FunctionCommand,但是当我在propertyGrid中选择属性Function时,会弹出一个CollectionEditor,当内部属性的类型为int,string,byte []时,此Collection Editor可以正常工作等等。但是我无法编辑更复杂的对象的属性。在这种情况下,RFunction属性将被禁用。

public partial class FunctionCommand
{
    /// <summary> Number of functions sent as part of the command</summary>
    public uint TotalNoOfFunctions { get; set; }

    /// <summary> Message structure for the function definition. Cloud shall always set this.</summary>
    public List<Function> Function { get; set; }

}

    public partial class Function
{
    public enum StoragePriorityENUM
    {
        LOW = 0,
        HIGH = 1,
    }

    /// <summary> Function id to uniquely identify a function</summary>
    public string FunctionId { get; set; }


    /// <summary> Set this ONLY for R function</summary>
    public RFunction RFunction { get; set; }
}

public partial class RFunction
{
    /// <summary> Diagnostics data for R function</summary>
    public DIAGData DiagData { get; set; }

    /// <summary>shall start the diagnostic process with a delay(minutes)</summary>
    public uint DelayTimeToStart { get; set; }

}

我可以在CollectionEditor外部正确编辑这些类型的对象,但不能在其内部正确编辑。 为什么此特定属性不可编辑,为什么要在CollectionEditor中编辑复杂对象?

编辑: 这是我在Treeview中创建实例的方式,这包括在必要时创建List <>的实例,“ types”变量是一个包含DLL中所有类型的列表:

private TreeNode GetSubTypes(Type subType, ref TreeNode rootObj, List<TreeNode> treenodeObj)
    {
        foreach (PropertyInfo prop in subType.GetProperties())
        {
            Type subtemp = null;
            Type[] temp = prop.PropertyType.GenericTypeArguments;
            if (temp.Length> 0)
            {
                subtemp = temp[0];
            }
            var childObj = new TreeNode();
            if (types.Contains(prop.PropertyType) || subtemp!=null)
            {
                childObj.Text = prop.Name;
                childObj.Tag = Activator.CreateInstance(prop.PropertyType);

                if (subtemp != null)
                {

                    var listType = typeof(List<>);
                    var constructedListType = listType.MakeGenericType(subtemp);


                    prop.SetValue(rootObj.Tag, Activator.CreateInstance(constructedListType));
                }
            }
            else
            {
                childObj.Text = prop.Name;
                childObj.Tag = "";
            }

            GetSubTypes(prop.PropertyType, ref childObj, treenodeObj);
            if(childObj.Text!="") rootObj.Nodes.Add(childObj);
            if (!usedTypes.Contains(prop.PropertyType.Name))
                usedTypes.Add(prop.PropertyType.Name);
            treenodeObj.RemoveAll(x => x.Text == prop.PropertyType.Name);
            treenodeObj.RemoveAll(x => x.Text == "");


        }
        return null;
    }

0 个答案:

没有答案