/// <summary> /// Возвращает значение, показывающее были ли изменения в данном элементе управления /// </summary> /// <returns></returns> public override bool GetChangeStatus() { if (Filter != null) { if (radio_ByLifelength.Checked) { FilterType ft = (FilterType)comboBoxFilterType.SelectedValue; Lifelength value = lifelengthViewerLifelength.Lifelength; if (Filter.FilterType != ft) { return(true); } //if ((value.IsNullOrZero() && Filter.Values.Length > 0) || // (!value.IsNullOrZero() && Filter.Values.Length != 1)) // return true; if (Filter.Values.Length != 1) { return(true); } if (!value.Equals(Filter.Values[0])) { return(true); } return(false); } if (Filter.FilterType != FilterType.In) { return(true); } Lifelength[] values = checkedListBoxItems.CheckedItems.OfType <Lifelength>().ToArray(); if (values.Length != Filter.Values.Length) { return(true); } if (values.Where((t, i) => !t.Equals(Filter.Values[i])).Any()) { return(true); } } return(false); }
///<summary> /// Проверяется, подходит ли элемент под фильтр ///</summary> ///<param name="item">Проверяемый элемент</param> ///<returns>Результат - подходит ли элемент</returns> public bool Acceptable(BaseEntityObject item) { if (item == null || FilterProperty == null || Values.Length == 0) { return(true); } PropertyInfo typeProp; if ((typeProp = item.GetType().GetProperty(FilterProperty.Name)) == null || !FilterProperty.PropertyType.Name.Equals(typeProp.PropertyType.Name)) { return(true); } if (FilterProperty.PropertyType.Name.ToLower() != "string" && FilterProperty.PropertyType.GetInterface(typeof(IEnumerable <>).Name) != null) { //Если свойство не string (string реализует интерфейс IEnumerable<>) //и реализует интерфейс IEnumerable<> то //производится поиск параметра универсального типа Type t = FilterProperty.PropertyType; while (t != null) { if (t.IsGenericType) { t = t.GetGenericArguments().FirstOrDefault(); break; } t = t.BaseType; } if (t == null) { return(false); } if (t.Name != typeof(T).Name) { return(false); } } else if (FilterProperty.PropertyType.Name != typeof(T).Name) { return(false); } object propertyValue = FilterProperty.GetValue(item, null); if (propertyValue == null) { return(false); } //Тип свойства реалтзует интерфейс IEnumerable if (FilterProperty.PropertyType.Name.ToLower() != "string" && FilterProperty.PropertyType.GetInterface(typeof(IEnumerable <>).Name) != null) { IEnumerable <T> convertedPropertyValue = ((IEnumerable <T>)propertyValue).ToArray(); if (!convertedPropertyValue.Any()) { return(false); } switch (FilterType) { case FilterType.Equal: return(convertedPropertyValue.Contains(Values[0])); case FilterType.NotEqual: return(!convertedPropertyValue.Contains(Values[0])); case FilterType.In: return(convertedPropertyValue.Any(cpv => Values.Contains(cpv))); //return Values.Any(v => convertedPropertyValue.Contains(v)); default: return(false); } } //Проверка, является ли переданный тип наследником BaseSmartCoreObject if (FilterProperty.PropertyType.IsSubclassOf(typeof(AbstractDictionary)) || FilterProperty.PropertyType.IsSubclassOf(typeof(StaticDictionary))) { switch (FilterType) { case FilterType.Equal: return(propertyValue.Equals(Values[0])); case FilterType.NotEqual: return(!propertyValue.Equals(Values[0])); case FilterType.In: return(Values.Any(v => propertyValue.Equals(v))); default: return(false); } } if (FilterProperty.PropertyType.GetInterface(typeof(IBaseEntityObject).Name) != null) { switch (FilterType) { case FilterType.Equal: return(propertyValue.Equals(Values[0])); case FilterType.NotEqual: return(!propertyValue.Equals(Values[0])); case FilterType.In: return(Values.Any(v => propertyValue.Equals(v))); default: return(false); } } if (FilterProperty.PropertyType.Name == typeof(Lifelength).Name) { Lifelength convertedPropertyValue = (Lifelength)propertyValue; Lifelength convertedFilterValue = Values[0] as Lifelength ?? Lifelength.Null; switch (FilterType) { case FilterType.Less: return(convertedPropertyValue.IsLessIgnoreNulls(convertedFilterValue)); case FilterType.LessOrEqual: return(convertedPropertyValue.IsLessOrEqualByAnyParameter(convertedFilterValue)); case FilterType.Equal: return(convertedPropertyValue.Equals(convertedFilterValue)); case FilterType.GratherOrEqual: return(convertedPropertyValue.IsGreaterOrEqualByAllParameters(convertedFilterValue)); case FilterType.Grather: return(convertedPropertyValue.IsGratherIgnoreNulls(convertedFilterValue)); case FilterType.NotEqual: return(!convertedPropertyValue.Equals(convertedFilterValue)); case FilterType.In: return(Values.OfType <Lifelength>().Any(convertedPropertyValue.Equals)); default: return(false); } } if (FilterProperty.PropertyType.IsEnum) { switch (FilterType) { case FilterType.Equal: return(Equals(propertyValue, Values[0])); case FilterType.NotEqual: return(!Equals(propertyValue, Values[0])); case FilterType.In: { return(Values.Any(value => Equals(value, propertyValue))); } default: return(false); } } string typeName = FilterProperty.PropertyType.Name.ToLower(); switch (typeName) { case "bool": case "boolean": { bool convertedPropertyValue = Convert.ToBoolean(propertyValue); bool convertedFilterValue = Convert.ToBoolean(Values[0]); switch (FilterType) { case FilterType.Equal: return(convertedPropertyValue == convertedFilterValue); case FilterType.NotEqual: return(convertedPropertyValue != convertedFilterValue); case FilterType.In: return(Values.Any(v => convertedFilterValue == Convert.ToBoolean(v))); default: return(false); } } case "datetime": { DateTime convertedPropertyValue = Convert.ToDateTime(propertyValue); DateTime convertedFilterValue = Convert.ToDateTime(Values[0]); switch (FilterType) { case FilterType.Less: return(convertedPropertyValue < convertedFilterValue); case FilterType.LessOrEqual: return(convertedPropertyValue <= convertedFilterValue); case FilterType.Equal: return(convertedPropertyValue == convertedFilterValue); case FilterType.GratherOrEqual: return(convertedPropertyValue >= convertedFilterValue); case FilterType.Grather: return(convertedPropertyValue > convertedFilterValue); case FilterType.NotEqual: return(convertedPropertyValue != convertedFilterValue); case FilterType.In: return(Values.Any(v => convertedFilterValue == Convert.ToDateTime(v))); case FilterType.Between: return(Convert.ToDateTime(Values[0]) <= convertedPropertyValue && convertedPropertyValue <= Convert.ToDateTime(Values[1])); default: return(false); } } case "double": { double convertedPropertyValue = Convert.ToDouble(propertyValue); double convertedFilterValue = Convert.ToDouble(Values[0]); switch (FilterType) { case FilterType.Less: return(convertedPropertyValue < convertedFilterValue); case FilterType.LessOrEqual: return(convertedPropertyValue <= convertedFilterValue); case FilterType.Equal: return(convertedPropertyValue == convertedFilterValue); case FilterType.GratherOrEqual: return(convertedPropertyValue >= convertedFilterValue); case FilterType.Grather: return(convertedPropertyValue > convertedFilterValue); case FilterType.NotEqual: return(convertedPropertyValue != convertedFilterValue); case FilterType.In: return(Values.Any(v => convertedFilterValue == Convert.ToDouble(v))); default: return(false); } } case "int16": { Int16 convertedPropertyValue = Convert.ToInt16(propertyValue); Int16 convertedFilterValue = Convert.ToInt16(Values[0]); switch (FilterType) { case FilterType.Less: return(convertedPropertyValue < convertedFilterValue); case FilterType.LessOrEqual: return(convertedPropertyValue <= convertedFilterValue); case FilterType.Equal: return(convertedPropertyValue == convertedFilterValue); case FilterType.GratherOrEqual: return(convertedPropertyValue >= convertedFilterValue); case FilterType.Grather: return(convertedPropertyValue > convertedFilterValue); case FilterType.NotEqual: return(convertedPropertyValue != convertedFilterValue); case FilterType.In: return(Values.Any(v => convertedFilterValue == Convert.ToInt16(v))); default: return(false); } } case "int32": { Int32 convertedPropertyValue = Convert.ToInt32(propertyValue); Int32 convertedFilterValue = Convert.ToInt32(Values[0]); switch (FilterType) { case FilterType.Less: return(convertedPropertyValue < convertedFilterValue); case FilterType.LessOrEqual: return(convertedPropertyValue <= convertedFilterValue); case FilterType.Equal: return(convertedPropertyValue == convertedFilterValue); case FilterType.GratherOrEqual: return(convertedPropertyValue >= convertedFilterValue); case FilterType.Grather: return(convertedPropertyValue > convertedFilterValue); case FilterType.NotEqual: return(convertedPropertyValue != convertedFilterValue); case FilterType.In: return(Values.Any(v => convertedFilterValue == Convert.ToInt32(v))); default: return(false); } } case "string": { string convertedPropertyValue = propertyValue.ToString().Trim().ToLower(); //для строкового фильтра в FilterType.Equal и FilterType.NotEqual //проверяются все значения switch (FilterType) { case FilterType.Equal: return(Values.Select(v => new Pattern(v.ToString().Trim().ToLower(), true, true)).All(p => p.IsMatch(convertedPropertyValue))); case FilterType.NotEqual: return(!Values.Select(v => new Pattern(v.ToString().Trim().ToLower(), true, true)).Any(p => p.IsMatch(convertedPropertyValue))); case FilterType.In: return(Values.Select(v => new Pattern(v.ToString().Trim().ToLower(), true, true)).Any(p => p.IsMatch(convertedPropertyValue))); default: return(false); } } } return(true); }