using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; using System.Reflection; using CommonLang.Property; using CommonFroms.Utils; using System.Drawing.Design; using CommonLang; using System.Collections; using CommonFroms.G2D.DataGrid; namespace CommonFroms.DescAttributeEdit { public partial class ValuePanel : UserControl { public object EditValue { get; private set; } private IG2DPropertyAdapter[] value_adapters; public ValuePanel() { InitializeComponent(); this.propertyGrid1.PropertySort = PropertySort.Categorized; } public void SetAdapters(IG2DPropertyAdapter[] adapters) { this.value_adapters = CUtils.ArrayLink(adapters, new ValuePanelAdapter(adapters)); } public void SetValue(object obj) { this.EditValue = obj; this.propertyGrid1.SelectedObject = new G2DPropertyDescriptor(obj, value_adapters); } class ValuePanelAdapter : IG2DPropertyAdapter { private IG2DPropertyAdapter[] adapters; public ValuePanelAdapter(IG2DPropertyAdapter[] adapters) { this.adapters = adapters; } public UITypeEditor GetEditor(MemberInfo field, Type fieldType, object ownerData) { return new ValuePanelUITypeEditor(adapters, field, ownerData); } public TypeConverter GetConverter(MemberInfo field, Type fieldType, object ownerData) { return null; } } class ValuePanelUITypeEditor : G2DMemberUITypeEditor { private IG2DPropertyAdapter[] adapters; private DescAttribute desc; public ValuePanelUITypeEditor(IG2DPropertyAdapter[] adapters, MemberInfo field, object ownerData) : base(field, ownerData) { this.adapters = CUtils.ArrayLink(adapters, new ValuePanelAdapter(adapters)); this.desc = PropertyUtil.GetAttribute(field); } public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) { if (fieldType.IsPrimitive) { return UITypeEditorEditStyle.None; } else if (fieldType.IsEnum) { return UITypeEditorEditStyle.None; } else if (fieldType.Equals(typeof(string))) { return UITypeEditorEditStyle.None; } else if (fieldType.IsClass) { return UITypeEditorEditStyle.Modal; } else if (fieldType.IsArray) { return UITypeEditorEditStyle.Modal; } return UITypeEditorEditStyle.Modal; } public override object EditValue( ITypeDescriptorContext context, IServiceProvider provider, object value) { ListAttribute listattr = PropertyUtil.GetAttribute(fieldInfo); if (listattr != null) { G2DCollectionEditor editor = new G2DCollectionEditor( fieldType, value, listattr.ElementTypes.ToArray(), adapters); if (editor.ShowDialog() == System.Windows.Forms.DialogResult.OK) { return editor.GetEditCompleteData(); } } else { object result = ValueTypeDialog.ShowValueDialog( null, "设置 " + desc.Desc, fieldType, value, adapters); if (result != null) { return result; } } return base.EditValue(context, provider, value); } } } }