From 3322022068ab818912d6f5d9e5eb31f51cc639c2 Mon Sep 17 00:00:00 2001 From: patrick.xu <patrick.xu@broconcentric.com> Date: 星期四, 24 二月 2022 09:12:30 +0800 Subject: [PATCH] 添加配置文件的DataShift2 --- src/Bro.Common.Model/Model/IOItem.cs | 155 +++++++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 137 insertions(+), 18 deletions(-) diff --git a/src/Bro.Common.Model/Model/IOItem.cs b/src/Bro.Common.Model/Model/IOItem.cs index 486d0ff..5610aaf 100644 --- a/src/Bro.Common.Model/Model/IOItem.cs +++ b/src/Bro.Common.Model/Model/IOItem.cs @@ -4,11 +4,12 @@ using System.Collections; using System.Collections.Generic; using System.ComponentModel; +using System.Globalization; using static Bro.Common.Helper.EnumHelper; namespace Bro.Common.Model { - public class IOItem : IComplexDisplay + public class IOItem : IComplexDisplay, IEqualityComparer { /// <summary> /// IO鐐圭紪鍙� @@ -21,8 +22,9 @@ /// IO鐐圭殑鍊� /// </summary> [Category("IO閰嶇疆")] - [Description("IO鏁板��")] - public virtual int Value { get; set; } + [Description("IO鐘舵��")] + [TypeConverter(typeof(EnumDescriptionConverter<IOValue>))] + public virtual IOValue Value { get; set; } /// <summary> /// IO鐐规槸in杩樻槸out @@ -31,14 +33,34 @@ [Description("IO绫诲瀷")] public virtual IOType IOType { get; set; } - public string GetDisplayText() + public new bool Equals(object x, object y) { - return $"{IOType.GetEnumDescription()},缂栧彿{IONum}锛孖O鐐圭殑鍊納Value}"; + if (x is IOItem a && y is IOItem b) + { + return a.IOType == b.IOType && a.IONum == b.IONum; + } + + return false; + } + + public virtual string GetDisplayText() + { + return $"{IOType.GetEnumDescription()}-{IONum}-{Value.GetEnumDescription()}"; + } + + public int GetHashCode(object obj) + { + return obj.GetHashCode(); } } public class IODefinition : IOItem { + [Category("IO閰嶇疆")] + [Description("IO棰勫畾涔�")] + [TypeConverter(typeof(EnumDescriptionConverter<IOPrestatement>))] + public IOPrestatement IOPreStatement { get; set; } = IOPrestatement.Customized; + [Category("IO閰嶇疆")] [Description("IO鐢ㄩ�旀弿杩�")] public string IODesc { get; set; } @@ -49,45 +71,142 @@ [Browsable(false)] [JsonIgnore] - public override int Value { get; set; } + public override IOValue Value { get; set; } - public new string GetDisplayText() + public override string GetDisplayText() { - return $"{IODesc} {IOType.GetEnumDescription()} {IONum}"; + return $"{(IOPreStatement == IOPrestatement.Customized ? IODesc : IOPreStatement.GetEnumDescription())} {IOType.GetEnumDescription()} {IONum}"; } } - public class IORefrenceItem + public class IORefrenceItem : IComplexDisplay { [Category("IO鎿嶄綔閰嶇疆")] [Description("闇�瑕佹搷浣滅殑IO")] [TypeConverter(typeof(IORefrenceItemSourceConverter))] - public IOItem IOItem { get; set; } = new IOItem(); + public IODefinition IOItem { get; set; } = new IODefinition(); [Category("IO鎿嶄綔閰嶇疆")] - [Description("闇�瑕佹搷浣滅殑IO鐨勬暟鍊�")] - public int CheckValue { get => IOItem.Value; set => IOItem.Value = value; } + [Description("闇�瑕佹搷浣滅殑IO鐨勭姸鎬�")] + public IOValue CheckValue + { + get => IOItem.Value; + set => IOItem.Value = value; + } [Browsable(false)] [JsonIgnore] public List<IODefinition> IOItemSource { get; set; } = new List<IODefinition>(); + + public string GetDisplayText() + { + return IOItem.IODesc + "-" + CheckValue.GetEnumDescription(); + } } - public class IORefrenceItemSourceConverter : ComboBoxItemTypeConvert + public class IORefrenceItemSourceConverter : TypeConverter { - public override Hashtable GetConvertHash(ITypeDescriptorContext context) + Dictionary<IODefinition, string> itemDict = new Dictionary<IODefinition, string>(); + public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) { - Hashtable table = new Hashtable(); - + itemDict.Clear(); if (context.Instance is IORefrenceItem item) { item.IOItemSource.ForEach(i => { - table[i.IODesc + i.IOType.GetEnumDescription() + i.IONum] = i as IOItem; + IODefinition temp = new IODefinition(); + temp.DataFrom(i); + itemDict[temp] = (string.IsNullOrWhiteSpace(i.IODesc) ? i.IOPreStatement.GetEnumDescription() : i.IODesc) + "|" + i.IOType.GetEnumDescription() + "|" + i.IONum; }); + + return new StandardValuesCollection(itemDict.Keys); } - return table; + return base.GetStandardValues(context); + } + public override bool GetStandardValuesSupported(ITypeDescriptorContext context) + { + return true; + } + + public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) + { + return true; + } + + public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) + { + if (sourceType == typeof(String)) + return true; + + return base.CanConvertFrom(context, sourceType); + } + + public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) + { + return base.CanConvertTo(context, destinationType); + } + + public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues) + { + return base.CreateInstance(context, propertyValues); + } + + /// <summary> + /// + /// </summary> + /// <param name="context"></param> + /// <param name="culture"></param> + /// <param name="value">string</param> + /// <returns></returns> + public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) + { + var s = value.ToString().Split(new char[] { '|' }); + + if (s.Length == 3) + { + foreach (KeyValuePair<IODefinition, string> pair in itemDict) + { + if (pair.Value == value.ToString()) + { + return pair.Key; + } + } + + IODefinition item = new IODefinition(); + item.IODesc = s[0]; + item.IOType = (IOType)Enum.Parse(typeof(IOType), s[1]); + item.IONum = int.Parse(s[2]); + return item; + } + + return base.ConvertFrom(context, culture, value); + } + + /// <summary> + /// + /// </summary> + /// <param name="context"></param> + /// <param name="culture"></param> + /// <param name="value">IOItem</param> + /// <param name="destinationType"></param> + /// <returns></returns> + public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) + { + if (value is IODefinition item) + { + foreach (KeyValuePair<IODefinition, string> pair in itemDict) + { + if (pair.Key.IOType == item.IOType && pair.Key.IONum == item.IONum) + { + return pair.Value; + } + } + + return item.IODesc + "-" + item.IOType.GetEnumDescription() + "-" + item.IONum; + } + + return base.ConvertTo(context, culture, value, destinationType); } } } -- Gitblit v1.8.0