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); }
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); }