Отредактируйте список <object>, в котором «объект» содержит другие объекты, используя PropertyGrid и CollectionEditor в C # - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть программа, в которой я загружаю DLL, содержащую различные типы объектов.При загрузке я создаю экземпляр каждого типа и сохраняю его в виде дерева (эти объекты могут содержать другие объекты внутри).Целью программы является редактирование этих объектов, поэтому у меня есть propertyGrid, который позволяет мне редактировать выбранный объект в древовидной структуре.Это прекрасно работает практически для каждого объекта.У меня просто возникают проблемы при редактировании объектов со свойствами, типами которых являются List of xObjectType, и этот xObjectType имеет свойство yObjectType as: например, эти классы определены в DLL, но мне нужно редактировать FunctionCommand, однако, когда я выбираю свойство Function вpropertyGrid - это CollectionEditor, этот редактор коллекций работает нормально, когда внутренние свойства имеют тип int, string, byte [] и т. д. Однако я не могу редактировать свойства, которые являются более сложными объектами.В этом случае свойство 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?

Редактировать: так я создаю экземпляры в древовидном представлении, это включает создание экземпляра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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...