private static TypedTreeViewDisplayMember GetGenericChild(TypedTreeViewDisplayMember tvdm, object obj, Type propType)
        {
            Type[] types;
            if (propType.IsGenericType)
            {
                types = (propType as Type).GetGenericArguments();
            }
            else//--это вообще не используется! убери это при первой же возможности
            {
                types    = new Type[1];
                types[0] = propType;
            }

            foreach (var type in types)
            {
                if (type.IsGenericType)
                {
                    TypedTreeViewDisplayMember tvdm2 = new TypedTreeViewDisplayMember("", (obj as PropertyInfo).Name);
                    tvdm2.DisplayСaption = "Collection";
                    tvdm2.NodeName       = string.Format("Node{0}", _nodescount);
                    _nodescount++;
                    tvdm2 = GetGenericChild(tvdm2, obj, type);
                    if (tvdm.ChildDisplayMembers == null)
                    {
                        tvdm.ChildDisplayMembers = new TypedTreeViewDisplayMemberList();
                    }
                    tvdm.ChildDisplayMembers.Add(tvdm2);
                }
                if (TypesHelper.IsStandardType(type))
                {
                    if (tvdm.ChildDisplayMembers == null)
                    {
                        tvdm.ChildDisplayMembers = new TypedTreeViewDisplayMemberList();
                    }
                    TypedTreeViewDisplayMember tvdm2 = new TypedTreeViewDisplayMember("", (obj as PropertyInfo).Name);
                    tvdm2.NodeName = string.Format("Node{0}", _nodescount);
                    _nodescount++;
                    tvdm.ChildDisplayMembers.Add(tvdm2);
                }
            }

            return(tvdm);
        }
Beispiel #2
0
        private void CreateControls()
        {
            #region Fields Creation
            foreach (var item in _editableItem.GetType().GetProperties())
            {
                bool standard = false;
                bool generic  = false;
                bool array    = false;

                //--Standard type
                if (TypesHelper.IsStandardType(item.PropertyType))
                {
                    if (item.PropertyType != typeof(bool))
                    {
                        Label lb = new Label();
                        lb.Text     = item.Name + ":";
                        lb.Top      = (this.Controls.Count * lb.Height);
                        lb.Left     = 2;
                        lb.AutoSize = true;
                        lb.SendToBack();
                        this.Controls.Add(lb);
                        TextBox tb = new TextBox();
                        tb.Top  = (this.Controls.Count * tb.Height);
                        tb.Left = 2;
                        tb.Name = string.Format("{0}_{1}", item.Name, "TextBox");
                        this.Controls.Add(tb);
                        _controlsBindings.Add(tb.Name, item.Name);
                    }
                    standard = true;
                }

                #region Generic type
                if (item.PropertyType.IsGenericType)
                {
                    generic = true;
                }
                #endregion

                #region Array Type
                if (item.PropertyType.IsArray)
                {
                    Type eltype = item.PropertyType.GetElementType();
                    if (TypesHelper.IsStandardType(eltype))
                    {
                    }

                    if (eltype.IsGenericType)
                    {
                    }

                    array = true;
                }
                #endregion

                #region Class type
                if (!standard && !generic && !array)
                {
                }
                #endregion
            }
            #endregion

            #region Ok & Cancel Buttons Creation
            Button but = new Button();
            but.Text = "ОК";
            but.Top  = (this.Controls.Count * but.Height);
            but.Left = 2;
            this.Controls.Add(but);
            but      = new Button();
            but.Text = "Отмена";
            but.Top  = this.Controls[this.Controls.Count - 1].Top;
            but.Left = this.Controls[this.Controls.Count - 1].Width + 6;
            this.Controls.Add(but);
            #endregion
        }
        //--максимум 2 вложенности для всего!
        public static TypedTreeViewDisplayMemberList GenerateTreeDescriptionFromObject(object obj, object parent)
        {
            TypedTreeViewDisplayMemberList res = new TypedTreeViewDisplayMemberList();

#warning Надо сделать правильную проверку и работу с коллецкиями!!!

            /*Type tp = anvlib.Utilities.TypeSystem.GetElementType(obj.GetType());
             * if (tp != obj.GetType())
             *  obj = Activator.CreateInstance(tp);*/
            if (parent == null)
            {
                _nodescount = 0;
            }
            //--пока работает только по свойствам
            foreach (var item in obj.GetType().GetProperties())
            {
                bool standard = false;
                bool generic  = false;
                bool array    = false;

                //--Standard type
                if (TypesHelper.IsStandardType(item.PropertyType))
                {
                    if (parent == null)
                    {
                        res.Add(GetStandardTypeDescription(item.Name));
                    }
                    else
                    {
                        var tvdm = GetStandardTypeDescription(item.Name);
                        tvdm.DataSourceName = parent.ToString();
                        res.Add(tvdm);
                    }
                    standard = true;
                }

                #region Generic type
                if (item.PropertyType.IsGenericType)
                {
                    TypedTreeViewDisplayMember tvdm2 = GetStandardTypeDescription("");
                    tvdm2.DisplayСaption = item.Name;
                    TypedTreeViewDisplayMember tvdm = GetGenericChild(tvdm2, item, item.PropertyType);
                    res.Add(tvdm);
                    generic = true;
                }
                #endregion

                #region Array Type
                if (item.PropertyType.IsArray)
                {
                    Type eltype = item.PropertyType.GetElementType();
                    if (TypesHelper.IsStandardType(eltype))
                    {
                        var ntvdm = GetStandardTypeDescription("");
                        ntvdm.DisplayСaption      = item.Name;
                        ntvdm.ChildDisplayMembers = new TypedTreeViewDisplayMemberList();
                        var child = new TypedTreeViewDisplayMember("", item.Name);
                        child.NodeName = string.Format("Node{0}", _nodescount);
                        _nodescount++;
                        ntvdm.ChildDisplayMembers.Add(child);
                        res.Add(ntvdm);
                    }

                    if (eltype.IsGenericType)
                    {
                        TypedTreeViewDisplayMember tvdm2 = GetStandardTypeDescription("");
                        tvdm2.DisplayСaption = item.Name;
                        TypedTreeViewDisplayMember tvdm3 = new TypedTreeViewDisplayMember("", item.Name);
                        tvdm3.DisplayСaption = "Collection";
                        tvdm3.NodeName       = string.Format("Node{0}", _nodescount);
                        _nodescount++;
                        tvdm2.ChildDisplayMembers.Add(tvdm3);
                        TypedTreeViewDisplayMember tvdm = GetGenericChild(tvdm3, item, eltype);
                        res.Add(tvdm2);
                    }

                    array = true;
                }
                #endregion

                #region Class type
                if (!standard && !generic && !array)
                {
                    TypedTreeViewDisplayMember tvdm = GetStandardTypeDescription("");
                    tvdm.DisplayСaption = item.Name;
                    try
                    {
                        var obj_instance = item.GetValue(obj, null);
                        tvdm.ChildDisplayMembers = GenerateTreeDescriptionFromObject(obj_instance, item.Name);
                        res.Add(tvdm);
                    }
                    catch
                    {
                    }
                }
                #endregion
            }

            return(res);
        }