Описан класс с вложенным классом и конвертерами типов | Код | [System.SerializableAttribute]
class AddrMapConverter : ExpandableObjectConverter { public override bool GetCreateInstanceSupported(ITypeDescriptorContext context) { return true; }
public override object CreateInstance(ITypeDescriptorContext context, System.Collections.IDictionary propertyValues) { return new AddrMap( (AddrField)propertyValues["AlarmWords"], (AddrField)propertyValues["DiscrIO"], (AddrField)propertyValues["Encoder"] ); } }
class AddrFieldConverter : ExpandableObjectConverter { public override bool GetCreateInstanceSupported(ITypeDescriptorContext context) { return true; }
public override object CreateInstance(ITypeDescriptorContext context, System.Collections.IDictionary propertyValues) { return new AddrField( (ushort)propertyValues["Addr"], (ushort)propertyValues["Word"], (ushort)propertyValues["bit"] ); } }
[System.SerializableAttribute] // [TypeConverter(typeof(AddrMapConverter))] [TypeConverter(typeof(AddrFieldConverter))] public class AddrField { public AddrField(ushort addr = 0, ushort count = 1, ushort _bit= 0) { this.Addr = addr; this.WordCount = count; this.bit = bit; } [DisplayName("Адрес")] public ushort Addr { get; set; } [DisplayName("Количество слов")] public ushort WordCount { get; set; } [DisplayName("Бит")] public ushort bit { get; set; } }
[System.SerializableAttribute] [TypeConverter(typeof(AddrMapConverter))] // [TypeConverter(typeof(ExpandableObjectConverter))] public class AddrMap { public AddrMap() { this.AlarmWords = new AddrField(); this.DiscrIO = new AddrField(); this.Encoder = new AddrField(); }
public AddrMap(AddrField Alarm, AddrField Discr, AddrField _Encoder) { this.AlarmWords = Alarm; this.DiscrIO = Discr; this.Encoder = _Encoder; } [DisplayName("Аварии")] [TypeConverter(typeof(ExpandableObjectConverter))] public AddrField AlarmWords { get; set; } [DisplayName("Дискретные входы/выходы")] [TypeConverter(typeof(ExpandableObjectConverter))] public AddrField DiscrIO { get; set; } [DisplayName("Энкодер")] [TypeConverter(typeof(ExpandableObjectConverter))] public AddrField Encoder { get; set; } [DisplayName("Адрес слова состояния тары")] public ushort TaraAddr { get; set; } [DisplayName("Бит состояния тары")] public ushort TaraBit { get; set; } }
|
В компоненте он используется следующим образом: | Код | private AddrMap f_addrmap; [DisplayName("Карта адресов")] [Description("Адреса блоков данных для различных операций - флаг тары, дискретные входы, аварии и тп")] [TypeConverter(typeof(AddrMapConverter))] public AddrMap Addr_Map { get { return f_addrmap; } set { f_addrmap = value; } }
|
Но когда компонент редактируешь в конструкторе это свойство не разворачивается в Property Grid.
|